uva 10048(floyd最短路)

求解从一个定点到另一个定点经过的路径中的最长边权值。

这道题是floyd算法的改进dis[i][j] = min(dis[i][j], max(dis[i][k], dis[k][j]));

dp方程不难退出。但是我被细节问题卡了一节课。优势最后一组样例输出了空行0.0

代码如下:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <cmath>
 6 #include <algorithm>
 7 #define LEN 1010
 8 #define INF 0x7fffffff
 9 using namespace std;
10 
11 int Map[LEN][LEN], dis[LEN][LEN];
12 int n, m, q, cnt = 1;
13 
14 void init()
15 {
16     for(int i=0; i<LEN; i++){
17         for(int j=0; j<LEN; j++){
18             Map[i][j] = INF;
19             if(i==j)Map[i][j] = 0;
20         }
21     }
22 }
23 
24 void floyd()
25 {
26     for(int i=1; i<=n; i++){
27         for(int j=1; j<=n; j++){
28             dis[i][j] = Map[i][j];
29         }
30     }
31     for(int k=1; k<=n; k++){
32         for(int i=1; i<=n; i++){
33             for(int j=1; j<=n; j++){
34                 dis[i][j] = min(dis[i][j], max(dis[i][k],dis[k][j]));
35             }
36         }
37     }
38 }
39 
40 int main()
41 {
42 //    freopen("in.txt", "r", stdin);
43 
44     int a, b, c;
45     while(scanf("%d%d%d", &n, &m, &q)!=EOF){
46         if(n==m && m==q && q==0) break;
47         init();
48         for(int i=0; i<m; i++){
49             scanf("%d%d%d", &a, &b, &c);
50             Map[a][b] = Map[b][a] = c;
51         }
52         floyd();
53         if(cnt!=1)printf("\n");
54         printf("Case #%d\n", cnt++);
55         for(int i=0; i<q; i++){
56             scanf("%d%d", &a, &b);
57             if(dis[a][b]!=INF) printf("%d\n", dis[a][b]);
58             else printf("no path\n");
59         }
60     }
61     return 0;
62 }
View Code

 

posted @ 2013-11-25 09:41  张小豪  阅读(210)  评论(0编辑  收藏  举报