求解从一个定点到另一个定点经过的路径中的最长边权值。
这道题是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(" "); 54 printf("Case #%d ", cnt++); 55 for(int i=0; i<q; i++){ 56 scanf("%d%d", &a, &b); 57 if(dis[a][b]!=INF) printf("%d ", dis[a][b]); 58 else printf("no path "); 59 } 60 } 61 return 0; 62 }