Floyd算法
作者:silence、2012年5月15日
本文参考:Google,数据结构(C语言)
本人声明:个人原创,转载请注明出处。
本文链接:http://blog.csdn.net/perfect2011/article/details/7568375
一 简介
Floyd算法是一种用于寻找图中每一对定点之间最短路径的算法。
二 重点
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