赞
踩
可以处理具有正或负边权(但没有负权回路)的加权图
求最短路径步骤
(1)初始时设置一个n阶方阵,令其对角线元素为0,若存在弧<Vi,Vj>,则对应元素为权值;否则为INF。
(2)逐步试着在原直接路径中增加中间顶点,若加入中间点后路径变短,则修改之;否则,维持原值。
(3)所有顶点试探完毕,算法结束
相对dijkstra算法floyd算法
- #include<iostream>
- using namespace std;
-
- const int N = 200, INF = 1e9;
-
- int n, m, Q;
- int d[N][N];
-
- void floyd()
- {
- d[1][1] = 0;
- for(int k = 1; k <= n; k++)
- for(int i = 1; i <= n; i++)
- for(int j = 1; j <= n; j++)
- {
- if(d[i][j] > d[i][k] + d[k][j])
- {
- d[i][j] = d[i][k] + d[k][j];
- }
- }
- }
-
- int main()
- {
- cin >> n >> m >> Q;
- for(int i = 1; i <= n; i++)
- for(int j = 1; j <= n; j++)
- {
- if(i == j) d[i][j] = 0;
- else d[i][j] = INF;
- }
- while(m--)
- {
- int a, b, c;
- scanf("%d %d %d",&a, &b, &c);
- d[a][b] = min(d[a][b],c);
- }
-
- floyd();
- while(Q--)
- {
- int a, b;
- scanf("%d %d", &a, &b);
- if(d[a][b] > INF / 2) puts("impossible");
- else cout << d[a][b] << endl;
- }
-
- return 0;
- }
优点在于:
1、从实现代码来看,Floyd算法的代码比用Dijkstra算法要简明得多;
2、Dijkstra的每一次调用都是独立的;
2、Floyd算法共享前面路径比较所得到的信息,从而来提高算法的效率;
4、实验验证当n或e较大时,Floyd算法比Dijkstra算法要省时的多。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。