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

题目链接:http://ac.jobdu.com/problem.php?id=1008

看到这道题,直接就想到要用dijkstra算法来做。后来看到网上说用SPFA算法来做更简单一些,我想先用dijkstra实现后在学习下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,adj[N][N],cost[N][N],visit[N],lowdis[N],lowcos[N];
10
11 void dijkstra(int s, int t)
12 {
13 memset(visit,0,sizeof(visit));
14 visit[s] = 1;
15 lowdis[s] = lowcos[s] = 0;
16 for(int i=1;i<=n;i++)
17 if(i != s)
18 {
19 lowdis[i] = adj[s][i];
20 lowcos[i] = cost[s][i];
21 }
22 int pos = s;
23 for(int i=1;i<n;i++)
24 {
25 int mindis = INF;
26 for(int j=1;j<=n;j++)
27 if(!visit[j] && lowdis[j] < mindis)
28 {
29 mindis = lowdis[j];
30 pos = j;
31 }
32 if(mindis == INF)
33 break;
34 visit[pos] = 1;
35 for(int j=1;j<=n;j++)
36 if(adj[pos][j] != INF && cost[pos][j] != INF && (lowdis[j] >= lowdis[pos] + adj[pos][j]))
37 {
38 if((lowdis[j] == lowdis[pos] + adj[pos][j] && lowcos[j] > lowcos[pos] + cost[pos][j]) || (lowdis[j] > lowdis[pos] + adj[pos][j]))
39 lowcos[j] = lowcos[pos] + cost[pos][j];
40 lowdis[j] = lowdis[pos] + adj[pos][j];
41 }
42 }
43 printf("%d %d\n",lowdis[t],lowcos[t]);
44 }
45
46 int main()
47 {
48 while(scanf("%d %d",&n,&m) != EOF)
49 {
50 if(n == 0 && m == 0)
51 break;
52 for(int i=1;i<=n;i++)
53 for(int j=1;j<=n;j++)
54 adj[i][j] = cost[i][j] = INF;
55 while(m--)
56 {
57 int a,b,d,p;
58 scanf("%d %d %d %d",&a,&b,&d,&p);
59 if(d < adj[a][b])
60 {
61 adj[a][b] = adj[b][a] = d;
62 cost[a][b] = cost[b][a] = p;
63 }
64 else if(d == adj[a][b] && p < cost[a][b])
65 cost[a][b] = cost[b][a] = p;
66 }
67 int s,t;
68 scanf("%d %d",&s,&t);
69 dijkstra(s,t);
70 }
71 return 0;
72 }



posted @ 2012-03-05 19:31  HanTQ  阅读(442)  评论(0编辑  收藏  举报