当前位置:   article > 正文

Floyd算法--+贪心算法_贪心算法解决floyd

贪心算法解决floyd

http://poj.org/problem?id=3615

题目大意:

给你n个站,有m条边,每条边有一个耗费值。

问你如果A站到B站可通,选一条路,每条可行路径上的相邻两站的耗费值有一个确定的最大值,使得尽量让这个值最小,输出。

否则输出-1.(有向无环图)

分析:

先确定任意两站间的最短路径,再找最大耗费值

 

  1. #include <iostream>
  2. #include <cstring>
  3. #include <iomanip>
  4. #include <cmath>
  5. #include <cstdio>
  6. #define K 99999999
  7. using namespace std;
  8. int N,M,T;
  9. void solve (int edge[][301])
  10. {
  11. for(int k=0;k<N;k++)
  12. {
  13. for(int i=0;i<N;i++)
  14. for(int j=0;j<N;j++)
  15. edge[i][j]=min(edge[i][j],edge[i][k]+edge[k][j]); //得最短路径
  16. }
  17. //在所有可行路径中选出最大障碍中最小的值
  18. for(int k=0;k<N;k++)
  19. for(int i=0;i<N;i++)
  20. for(int j=0;j<N;j++)
  21. if(edge[i][j]<K)
  22. {
  23. //①如果edge[i][j]是由更新而来的,可行路径中的最大障碍的最小值max(edge[i][k],edge[k][j])一定<原来的edge[i][j](edge[i][k]+edge[k][j]<edge[i][j])
  24. //②如果edge[i][j]等于原先的值,即edge[i][k]+edge[k][j]>edge[i][j];在两条路径中的最大障碍中选出最小的而一个
  25. edge[i][j]=min(edge[i][j],max(edge[i][k],edge[k][j]));
  26. }
  27. return ;
  28. }
  29. int main()
  30. {
  31. while(scanf("%d%d%d",&N,&M,&T)!=EOF)
  32. {
  33. int edge[301][301];
  34. int i,j,row,col,value;
  35. memset(edge,0x3f,sizeof(edge));
  36. for(i=0;i<M;i++)
  37. {
  38. scanf("%d%d",&row,&col);
  39. scanf("%d",&edge[row-1][col-1]);
  40. }
  41. solve(edge);
  42. /* cout<<"得到的最大障碍表:"<<endl;
  43. for(i=0;i<N;i++)
  44. {
  45. for(j=0;j<N;j++)
  46. cout<<left<<setw(8)<<edge[i][j]<<" ";
  47. cout<<endl;
  48. }
  49. */
  50. int start,over;
  51. for(i=0;i<T;i++)
  52. {
  53. scanf("%d%d",&start,&over);
  54. if(edge[start-1][over-1]>=K ) printf("-1\n");
  55. else printf("%d\n",edge[start-1][over-1]);
  56. }
  57. }
  58. return 0;
  59. }

 

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/822073
推荐阅读
相关标签
  

闽ICP备14008679号