HDU 2544 最短路 最短路问题

解题报告:

这题就是求两个单源点之间的最小距离,属于最短路问题,由于数据量很小,只有100,所以这题可以用弗洛伊德也可以用迪杰斯特拉,都可以过,但是用迪杰斯特拉会快一点,但用弗洛伊德的代码会稍短一点,纯属裸的算法题,这里给出两种算法的代码:

弗洛伊德算法:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 const int MAX = 0xfffff;
 5 int map[105][105];
 6 int main() {
 7     int N,M,x,y,z;
 8     while(scanf("%d%d",&N,&M)&&(N||M)) {
 9         for(int i = 1;i<=N;++i)
10         for(int j = 1;j<=N;++j)
11         map[i][j] = (i==j? 0:MAX);
12         for(int i  = 1;i<=M;++i) {
13             scanf("%d%d%d",&x,&y,&z);
14             map[x][y] = map[y][x] = z;
15         }
16         for(int i = 1;i<=N;++i)
17         for(int j = 1;j<=N;++j)
18         for(int k = 1;k<=N;++k)
19         map[j][k] = std::min(map[j][k],map[j][i]+map[i][k]);
20         printf("%d\n",map[1][N]);
21     }
22     return 0;
23 }
24     
View Code

迪杰斯特拉:

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 const int MAX = 0xffff;
 5 int map[105][105],T[105],visit[105];
 6 int main() {
 7     int N,M,x,y,z;
 8     while(scanf("%d%d",&N,&M)&&(N||M)) {
 9         for(int i = 1;i<=N;++i) {
10             T[i] = MAX;
11             for(int j = 1;j<=N;++j)
12             map[i][j] = MAX;
13         }
14         for(int i = 1;i<=M;++i) {
15             scanf("%d%d%d",&x,&y,&z);
16             map[x][y] = map[y][x] = z;
17         }
18         memset(visit,0,sizeof(visit));
19         T[1] = 0;
20         int s = 1;
21         while(1) {
22             if(s==N)
23             break;
24             for(int i = 1;i<=N;++i)
25             T[i] = std::min(T[i],T[s]+map[s][i]);
26             visit[s] = 1;
27             int Min = MAX;
28             for(int i = 1;i<=N;++i)
29             if(!visit[i]&&(T[i]<Min)) {
30                 s = i;
31                 Min = T[i];
32             }
33         }
34         printf("%d\n",T[N]);
35     }
36     return 0;
37 }
38             
View Code

 

 

posted @ 2013-07-17 17:30  xiaxiaosheng  阅读(217)  评论(0编辑  收藏  举报