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 }

你可能感兴趣的:(floyd)