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 }
posted @ 2012-08-26 21:22  proverbs  阅读(431)  评论(0编辑  收藏  举报