Floyd最短路算法

161 阅读1分钟

Floyd算法

Fload使用的存储方式为邻接矩阵,该算法可以求出所有点对之间的最短距离,其他3个算法只能求出单个点到其他点之间的最短距离。但是Fload的时间复杂度为O(n^3)比较高,所以只适用于小规模图。

优点:

  1. 可以一次性求出所有结点之间的距离
  2. 可以处理有负边权的图

Floyd算法思想

该算法利用了动态规划的思想:求两点i,j之间的最短距离,可以分成两种情况:经过图中点k的路径和不经过图中点k的路径,取两者中最短路径即可。

代码

int g[N][N];
int INF=0x3f;
void init()//首先需要初始化距离为无限大,相当于不连通。 
{
	memset(g,0x3f,sizeof g);
} 
void addEdge(int a,int b,int w)//添加点和边, 
{
	g[a][b]=g[b][a]=w;//无向图
	//有向图:g[a][b]=w; 
} 
void Floyd(int n)//n个点
{
	for(int k=1;k<=n;k++)
	{
		for(int i=1;i<=n;i++)
		{
			if(g[i][k]==INF) continue;//如果i到k的距离为无限大,表示i、k不不连通。 
			for(int j=1;j<=n;j++)
			{
				if(g[i][j]>g[i][k]+g[k][j])
				{
					g[i][j]=g[i][k]+g[k][j];
				}
			}
		}
	}
} 
//g[i][j]表示从i点到j点的最短距离 

判断负环

在算最短路径的时候g[i][i]的值并不是0,最后的值为g[i][i]=g[i][u]+……+g[v][i];所以可以看出g[i][i]表示i点在外面转了一圈回来之后的最短距离。如果g[i][i]<0表示图中存在负环。