最小环-Floyd

floyd求最小环

在Floyd的同时,顺便算出最小环。
Floyd算法
 1 for(k=1;k<=n;k++)
 2   { for(i=1;i<k;i++)
 3      for(j=i+1;j<k;j++)
 4       if(d[i][j]+m[i][k]+m[k][j]<min)
 5        min=d[i][j]+m[i][k]+m[k][j];
 6     for(i=1;i<=n;i++)
 7      for(j=1;j<=n;j++)
 8       if(d[i][k]+d[k][j]<d[i][j])
 9        d[i][j]=d[i][k]+d[k][j];
10   }
保证了最外层循环到 k 时所有顶点间已求得以 0...k-1 为中间点的最短路径。一
个环至少有 3 个顶点,设某环编号最大的顶点为 L ,在环中直接与之相连的两个顶点编号
分别为 M 和 N (M,N < L),则最大编号为 L 的最小环长度即为 Graph(M,L) + Graph(N,L) +
Dist(M,N) ,其中 Dist(M,N) 表示以 0...L-1 号顶点为中间点时的最短路径,刚好符合 Floyd
算法最外层循环到 k=L 时的情况,则此时对 M 和 N 循环所有编号小于 L 的顶点组合即
可找到最大编号为 L 的最小环。再经过最外层 k 的循环,即可找到整个图的最小环。

上面是对无向图的情况
若是有向图,只需稍作改动。注意考虑有向图中 2 顶点即可组成环的情况

猜你喜欢

转载自www.cnblogs.com/liuwenhan/p/11376160.html
今日推荐