floyd算法:
对于一个含有 个结点的无负环图 (通常用邻接矩阵存储),floyd算法可以用于解决全源最短路问题,和查找无向图中最小环,时间复杂度 ,
①全源最短路问题:
邻接矩阵 :表示边 的距离,INF表示 之间无边直接相连
:表示从 到 的最短路距离
int n,g[maxn][maxn];
int dist[maxn][maxn];
void floyd()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
dist[i][j]=g[i][j];
for(int k=1;k<=n;k++) //枚举结点 k
{
for(int i=1;i<=n;i++) //以 k为中介点,优化i到j的最短路
{
for(int j=1;j<=n;j++)
{
if(dist[i][k]!=INF&&dist[k][j]!=INF)
dist[i][j]=min(dist[i][j],dist[i][k]+dist[k][j]);
}
}
}
}
②无向图找最小环:
int n,g[maxn][maxn];
int dist[maxn][maxn];
int floyd()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
dist[i][j]=g[i][j];
int min_circle=INF;
for(int k=1;k<=n;k++) //枚举k
{
//先判断环,后更新,保证判断环时的dist[i][j]不经过 k
for(int i=1;i<k;i++)
{
for(int j=i+1;j<k;j++)
{
if(dist[i][j]!=INF&&g[i][k]!=INF&&g[j][k]!=INF) //环至少要有3个结点
min_circle=min(min_circle,dist[i][j]+g[i][k]+g[j][k]);
//i-j不经过k的最短路 + 边i-k + 边j-k
}
}
//以下和求全源最短路一致,更新以k为中介点的最短路
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(dist[i][k]!=INF&&dist[k][j]!=INF)
dist[i][j]=min(dist[i][j],dist[i][k]+dist[k][j]);
}
}
}
return min_circle;
}