最短路径—Floyd算法

冷不防 2022-05-12 05:50 424阅读 0赞

Floyd算法:

1,从任意一条单边路径开始。所有两点之间的距离是边的权,如果两点之间没有边相连,则权为无穷大。

2,对于每一对顶点 u 和 v,看看是否存在一个顶点 w 使得从 u 到 w 再到 v 比已知的路径更短。如果是更新它。

Floyd-Warshall——只有五行的算法

求任意两个点之间的最短路程。 从i号顶点到j号顶点只经过前k号顶点的最短路程,这是一种动态规划的思想。

2017080422185443920170804222015725

算法作为三个嵌套for循环。

  1. for(k=1;k<=n;k++)
  2. for(i=1;i<=n;i++)
  3. for(j=1;j<=n;j++)
  4. if(e[i][j]>e[i][k]+e[k][j])
  5. e[i][j]=e[i][k]+e[k][j];

n个顶点,m条边,接下来的m行每一行有3个数,顶点u,v以及他们之间的距离 l。

  1. #include<iostream>
  2. using namespace std;
  3. int e[111][111];
  4. int n,m,u,v,l;
  5. const int inf=999999;
  6. void init()
  7. {
  8. for(int i=1;i<=n;i++)
  9. {
  10. for(int j=1;j<=n;j++)
  11. {
  12. if(i==j)
  13. e[i][j]=0;
  14. else
  15. e[i][j]=inf;
  16. }
  17. }
  18. }
  19. void floyd()
  20. {
  21. int i,j,k;
  22. for(k=1;k<=n;k++)
  23. {
  24. for(i=1;i<=n;i++)
  25. {
  26. for(j=1;j<=n;j++)
  27. {
  28. if(e[i][k]<inf&&e[k][j]<inf&&e[i][j]>e[i][k]+e[k][j])
  29. e[i][j]=e[i][k]+e[k][j];
  30. }
  31. }
  32. }
  33. }
  34. int main()
  35. {
  36. int i,j;
  37. cin>>n>>m;
  38. init();
  39. //读入边
  40. for(i=1;i<=m;i++)
  41. {
  42. cin>>u>>v>>l;
  43. e[u][v]=l;
  44. }
  45. floyd();
  46. for(i=1;i<=n;i++)
  47. {
  48. for(j=1;j<=n;j++)
  49. {
  50. cout<<e[i][j]<<endl;
  51. }
  52. }
  53. return 0;
  54. }

70

发表评论

表情:
评论列表 (有 0 条评论,424人围观)

还没有评论,来说两句吧...

相关阅读

    相关 路径Floyd算法

    Floyd算法: 1,从任意一条单边路径开始。所有两点之间的距离是边的权,如果两点之间没有边相连,则权为无穷大。 2,对于每一对顶点 u 和 v,看看是否存在一个顶点 w