无向图最小环算法floy

夕阳红老菜鸡要退役啦~
这个月再打完两场比赛就可以退役了。退役之后把自己学过的算法挑出来写博客,一是给自己留个纪念,不要比赛完了就忘记了学过的算法,第二是希望能帮助到别人,在我学习算法的时候,也看过很多别人的博客,在我退役之后,也写写博客帮助他人吧。
这里给出一个floy求无向图最小环的算法。

//floy 求解无向图最小环
/*
1.理论依据: 
如果某个最小环中,有一条边V[u][v],那么把这条边去掉之后,这个环路
就变成一条简单路径,而且这个简单路径一定是不包括边V[u][v]的情况下
整个图中u、v的最短路
2.floy算法复习(请参照下面的代码): 
在floy算法之后,当k = ki的时候,我们已经计算出前k - 1个点的最短路径
而且这k-1个点不包括点k,他们的最短路径也不包括点k的边。
3.算法解释 
因此,现在我们计算前k个点的最短路径,就是算式dist[i][j] + G[i][k] + G[k][j]
首先,我们考虑G[i][k] + G[k][j],这个意味着前k-1个点中,取某两个点,经过点k、
且不经过其他的属于前k-1个点的路径。我们枚举i、j,就能得到k点所能直接连接的
(在前k-1个点钟)的任意两个节点,再加上(在前k-1个节点)中的最短路径,就能
计算出前k个节点的最短回路了。 
*/ 
#define rep(i,a,b) for(int i = (a);i < (b);i++) 
int dist[MAXN][MAXN];   //distance 
int G[MAXN][MAXN];      //注意初始化的时候inf = INT_MAX / 3 
int floy(){
 int minc = INT_MAX;
 rep(k,1,N + 1){
 rep(i,1,k)rep(j,i + 1,k)//注意下式不能溢出 
 minc = min(minc,dist[i][j] + G[i][k] + G[k][j]);
 rep(i,1,N + 1)rep(j,1,N + 1)//求解包括k节点之后的最短路径 
 dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);
 }
 return minc; 
}
点赞