Floyd算法
Fload使用的存储方式为邻接矩阵,该算法可以求出所有点对之间的最短距离,其他3个算法只能求出单个点到其他点之间的最短距离。但是Fload的时间复杂度为O(n^3)比较高,所以只适用于小规模图。
优点:
- 可以一次性求出所有结点之间的距离
- 可以处理有负边权的图
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表示图中存在负环。