图论 —— floyd算法(全源最短路问题 / 无向图找最小环)

floyd算法:

对于一个含有 n n 个结点的无负环图 G G (通常用邻接矩阵存储),floyd算法可以用于解决全源最短路问题,和查找无向图中最小环,时间复杂度 O ( n 3 ) O(n^3)



①全源最短路问题:

邻接矩阵 g [ i ] [ j ] g[i][j] :表示边 i j i\rarr j 的距离,INF表示 i , j i,j 之间无边直接相连

d i s t [ i ] [ j ] dist[i][j] :表示从 i i j j 的最短路距离

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;
}
发布了214 篇原创文章 · 获赞 40 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Ratina/article/details/99848524
今日推荐