当前位置:   article > 正文

Floyd求所有顶点对之间的最短路径_使用floyd算法求各顶点之间最短路径的思想

使用floyd算法求各顶点之间最短路径的思想

可以处理具有正或负边权(但没有负权回路)的加权图

算法思想——逐个点试探

求最短路径步骤 

(1)初始时设置一个n阶方阵,令其对角线元素为0,若存在弧<Vi,Vj>,则对应元素为权值;否则为INF。

(2)逐步试着在原直接路径中增加中间顶点,若加入中间点后路径变短,则修改之;否则,维持原值。 

(3)所有顶点试探完毕,算法结束 

 

 

 

 

相对dijkstra算法floyd算法

  1. #include<iostream>
  2. using namespace std;
  3. const int N = 200, INF = 1e9;
  4. int n, m, Q;
  5. int d[N][N];
  6. void floyd()
  7. {
  8. d[1][1] = 0;
  9. for(int k = 1; k <= n; k++)
  10. for(int i = 1; i <= n; i++)
  11. for(int j = 1; j <= n; j++)
  12. {
  13. if(d[i][j] > d[i][k] + d[k][j])
  14. {
  15. d[i][j] = d[i][k] + d[k][j];
  16. }
  17. }
  18. }
  19. int main()
  20. {
  21. cin >> n >> m >> Q;
  22. for(int i = 1; i <= n; i++)
  23. for(int j = 1; j <= n; j++)
  24. {
  25. if(i == j) d[i][j] = 0;
  26. else d[i][j] = INF;
  27. }
  28. while(m--)
  29. {
  30. int a, b, c;
  31. scanf("%d %d %d",&a, &b, &c);
  32. d[a][b] = min(d[a][b],c);
  33. }
  34. floyd();
  35. while(Q--)
  36. {
  37. int a, b;
  38. scanf("%d %d", &a, &b);
  39. if(d[a][b] > INF / 2) puts("impossible");
  40. else cout << d[a][b] << endl;
  41. }
  42. return 0;
  43. }

优点在于: 

1、从实现代码来看,Floyd算法的代码比用Dijkstra算法要简明得多; 

2、Dijkstra的每一次调用都是独立的; 

2、Floyd算法共享前面路径比较所得到的信息,从而来提高算法的效率; 

4、实验验证当n或e较大时,Floyd算法比Dijkstra算法要省时的多。

 

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/797430
推荐阅读
相关标签
  

闽ICP备14008679号