浙大2010考研复试上机题——最短路径问题(SPFA算法)

这是对之前用dijkstra写的那题的重写。

 1 #include <iostream>
2 #include <cstdio>
3 #include <cstring>
4 using namespace std;
5
6 #define N 1001
7 #define INF 0x3f3f3f3f
8
9 int n,m,dist[N][N],cost[N][N],vis[N],lowcost[N],lowdist[N],queue[N*N];
10
11 void spfa(int s)
12 {
13 memset(vis,0,sizeof(vis));
14 memset(queue,0,sizeof(queue));
15 memset(lowcost,INF,sizeof(lowcost));
16 memset(lowdist,INF,sizeof(lowdist));
17 int front = 0, rear = 1;
18 queue[front] = s;
19 vis[s] = 1;
20 lowcost[s] = lowdist[s] = 0;
21 while(front < rear)
22 {
23 int t = queue[front++];
24 vis[t] = 0;
25 for(int i=1;i<=n;i++)
26 {
27 if(lowdist[t] + dist[t][i] < lowdist[i])
28 {
29 lowdist[i] = lowdist[t] + dist[t][i];
30 lowcost[i] = lowcost[t] + cost[t][i];
31 if(!vis[i])
32 {
33 vis[i] = 1;
34 queue[rear++] = i;
35 }
36 }
37 else if(lowdist[t] + dist[t][i] == lowdist[i] && lowcost[i] > lowcost[t] + cost[t][i])
38 {
39 lowcost[i] = lowcost[t] + cost[t][i];
40 if(!vis[i])
41 {
42 vis[i] = 1;
43 queue[rear++] = i;
44 }
45 }
46 }
47 }
48 }
49
50 int main()
51 {
52 while(scanf("%d %d",&n,&m) != EOF && (n || m))
53 {
54 memset(dist,INF,sizeof(dist));
55 memset(cost,INF,sizeof(cost));
56 while(m--)
57 {
58 int a,b,d,p;
59 scanf("%d %d %d %d",&a,&b,&d,&p);
60 if(dist[a][b] > d)
61 {
62 dist[a][b] = dist[b][a] = d;
63 cost[a][b] = cost[b][a] = p;
64 }
65 else if(dist[a][b] == d && cost[a][b] > p)
66 cost[a][b] = cost[b][a] = p;
67 }
68 int s,e;
69 scanf("%d %d",&s,&e);
70 spfa(s);
71 printf("%d %d\n",lowdist[e],lowcost[e]);
72 }
73 return 0;
74 }

 

posted @ 2012-03-22 15:24  HanTQ  阅读(286)  评论(0编辑  收藏  举报