全文转自:http://blog.csdn.net/perfect2011/article/details/7568375
Floyd算法
作者:silence、2012年5月15日
本文参考:Google,数据结构(C语言)
本人声明:个人原创,转载请注明出处。
本文链接:http://blog.csdn.net/perfect2011/article/details/7568375
一 简介
1,从任意一条单边路径开始。所有两点之间的距离是边的权,或者无穷大,如果两点之间没有边相连。
2,对于每一对顶点 u 和 v,看看是否存在一个顶点 w 使得从 u 到 w 再到 v 比己知的路径更短。如果是更新它
。
三 代码实现
- #include <cstdlib>
- #include <iostream>
- /*
- Author : silence
- Time : 2012/5/15
- description : 每一对顶点的最短距离
- */
- using namespace std;
- struct Graph
- {
- int arrArc[20][20];
- int verCount;
- int arcCount;
- };
- void floyd(Graph *p,int dis[20][20]){
- for(int k = 0;k<p->verCount;k++)
- for(int i = 0;i<p->verCount;i++)
- for(int j = 0;j<p->verCount;j++)
- {
- //存在更近的路径,则更新
- if(dis[i][j]>dis[i][k]+dis[k][j])
- dis[i][j]=dis[i][k]+dis[k][j];
- }
- }
- int main(int argc, char *argv[])
- {
- Graph g;
- cout<<"input the number of ver and arc"<<endl;
- cin>>g.verCount>>g.arcCount;
- cout<<"input the arc"<<endl;
- //初始化邻接矩阵
- for(int i = 0;i<g.verCount;i++)
- { for(int j = 0;j<g.verCount;j++)
- {
- //i到本身的距离为0
- //不同节点值为不可达
- if(i==j) g.arrArc[i][i]= 0;
- else
- g.arrArc[i][j] = 65535;
- }
- }
- int a,b,distance;
- //无向图 输入各边的权值
- for(int i=0;i<g.arcCount;i++)
- {
- cin>>a>>b>>distance;
- g.arrArc[a][b]=g.arrArc[b][a]=distance;
- }
- floyd(&g,g.arrArc);
- cout<<g.arrArc[0][1]<<endl;
- system("PAUSE");
- return EXIT_SUCCESS;
- }
四 算法剖析
Floyd算法的基本思想如下:从任意节点A到任意节点B的最短路径不外乎2种可能:
1是直接从A到B,
2是从A经过若干个节点X到B。
所以,我们假设dis(AB)为节点A到节点B的最短路径的距离,对于每一个节点X,我们检查dis(AX) + dis(XB) < dis(AB)是否成立,如果成立,证明从A到X再到B的路径比A直接到B的路径短,我们便设置dis(AB)= dis(AX) +dis(XB),这样一来,当我们遍历完所有节点X,dis(AB)中记录的便是A到B的最短路径的距离。
五注意点
三个循环的求中间点的K的循环必须放在外面。
因为如果放在内层,对于A—B之间的经过AX和BX的还没有求到最小值,所以A—B最后不是最小值
六测试数据
Input:
4 4
0 1 11
1 2 2
2 3 3
3 0 4
Output :
9