这是用的SPFA算法做的最短路
#include <iostream> #include <cstdio> #include <cstring> #include <queue> #define Max 0xfffffff using namespace std; int n,m,d[1111],p[1111];//d是路程,p是消费 bool qwe[1111];//记录是否在队列中 struct ssss { int x,y; }s[1111][1111];//地图 queue<int> q,qq; void SPFA() { int a,i; while(!q.empty())//只要队列非空 { a=q.front();//取出对首元素 q.pop();//对首出队 qwe[a]=true;//标记在队列外 for(i=1;i<=n;i++)//遍历所有可以到的点 if(i!=a) { if(d[i]>d[a]+s[a][i].x)//满足松弛条件就进行松弛操作 { d[i]=d[a]+s[a][i].x; p[i]=p[a]+s[a][i].y; if(qwe[i])//并判断是否在队外,在队外就入队并标记 { q.push(i); qwe[i]=false; } }else if(d[i]==d[a]+s[a][i].x&&p[i]>p[a]+s[a][i].y) p[i]=p[a]+s[a][i].y; } } } int main (void) { int i,j,a,b,c,e; while(~scanf("%d%d",&n,&m)&&(n||m)) { q=qq; for(i=1;i<=n;i++) { qwe[i]=true; d[i]=p[i]=Max; for(j=1;j<=i;j++) s[i][j].x=s[i][j].y=s[j][i].x=s[j][i].y=Max; } for(i=0;i<m;i++) { scanf("%d%d%d%d",&a,&b,&c,&e); if(s[a][b].x>c)//记录最优条件 { s[a][b].x=s[b][a].x=c; s[a][b].y=s[b][a].y=e; } } scanf("%d%d",&a,&b); d[a]=p[a]=0; qwe[a]=false; q.push(a); SPFA(); printf("%d %d\n",d[b],p[b]); } return 0; }
这是我刚学SPFA算法做的题,先前只知道dijkstra,而且还是学长说着玩说给我听的,现在学最短路了,就选了这个比较好的算法,最短路问题主要是松弛操作