POJ 3615(FLOYD应用)
大致题意:有N个木桩,和M个木桩对之间的高度差(从x跳到y需要往上跳的高度)。从x跳跃到y的路径消耗的体力值是路径中的一个最大高度差。求一条消耗体力最小的路径。
思路:-和POJ 1797类似,只是这道题的没有固定起点和终点,而是在询问中给出,询问还特别多,这个不用想,肯定要预处理出来答案的
第一次floyd处理的是连通性,map[i][j]此时的含义是从i到j的最短路径长度
第二次floyd处理的是两点间路径的最小的最大值,嗯,就是这样
View Code
1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <iostream> 5 using namespace std; 6 int map[350][350],n,m,q; 7 void read() 8 { 9 memset(map,0x3f,sizeof map); 10 for(int i=1,a,b,c;i<=m;i++) 11 { 12 scanf("%d%d%d",&a,&b,&c); 13 map[a][b]=c; 14 } 15 for(int i=1;i<=n;i++) map[i][i]=0; 16 } 17 void floyd() 18 { 19 for(int k=1;k<=n;k++) 20 for(int i=1;i<=n;i++) 21 for(int j=1;j<=n;j++) 22 map[i][j]=min(map[i][j],map[i][k]+map[k][j]); 23 for(int i=1;i<=n;i++) map[i][i]=0x7f7f7f7f; 24 for(int k=1;k<=n;k++) 25 for(int i=1;i<=n;i++) 26 for(int j=1;j<=n;j++) 27 if(map[i][j]<=99999999) 28 map[i][j]=min(map[i][j],max(map[i][k],map[k][j])); 29 } 30 void go() 31 { 32 floyd(); 33 int a,b; 34 while(q--) 35 { 36 scanf("%d%d",&a,&b); 37 if(a==b) printf("0\n"); 38 else 39 { 40 if(map[a][b]>99999999) printf("-1\n"); 41 else printf("%d\n",map[a][b]); 42 } 43 } 44 } 45 int main() 46 { 47 while(scanf("%d%d%d",&n,&m,&q)!=EOF) 48 { 49 read(); 50 go(); 51 } 52 return 0; 53 }
没有人能阻止我前进的步伐,除了我自己!