解题报告:
这题就是求两个单源点之间的最小距离,属于最短路问题,由于数据量很小,只有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 ",map[1][N]); 21 } 22 return 0; 23 } 24
迪杰斯特拉:
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 ",T[N]); 35 } 36 return 0; 37 } 38