Floyd求最小環

2022-06-04 04:12:09 字數 1486 閱讀 6647

floyd 可以求解圖上的最小環

這裡需要注意的是無向圖和有向圖的求法是不一樣的

有向圖 : 正常跑一遍 floyd 再遍歷所有的 dp[i][i] 即自身到自身的距離,便是所求的最小環

#includeusing

namespace

std;

const

int maxn = 2005

;const

int inf = 0x3f3f3f3f

;int

n, m;

int dis[maxn][maxn]; //

記錄路徑長

int path[maxn][maxn]; //

記錄實際路徑

inline

void

floyd_warshall()}}

}}int main(void

) }

if(idx == -1

) printf(

"mincost = %d\n

", mincost);

int tmp =idx;

bool flag = true

;

while(true)puts(

"");

}return0;

}

view code

無向圖 : 參考部落格 (注意:由於是無向圖,所以求解出來的環都是 n ≥ 3 的,不考慮 n == 2 或者 n == 1 自環的情況)

#includeusing

namespace

std;

const

int maxn = 2e3 + 10

;const

int inf = 0x3f3f3f3f

;long

long

dp[maxn][maxn], g[maxn][maxn];

long

long

mincost;

intfa[maxn][maxn], path[maxn], num;

intn, m;

void

floyd()

path[num++] =i;

path[num++] =k;}}

}for(int i=1; i<=n; i++)}}

}}int main(void)//

for(int i=1; i<=n; i++)puts("");

//}puts("");

if(mincost ==inf)

printf("%d

", path[num-1]-1

);

for(int i=num-2; i>=0; i--)

printf("%d

", path[i]-1

); puts(

"");

}return0;

}

view code

floyd求最小環

floyd求最小環 1 定義 通常來說最小環是針對有向圖而言 從乙個點出發,經過一條簡單路徑回到起點成為環.圖的最小環就是所有環中長度最小的.2.怎樣求最小環呢?的解決方法 dijkstra 任意乙個環的權值,我們都可以看成兩個有邊相連的結點i j的直接距離加上i j間不包含邊 邊i j 的最短路徑...

floyd求最小環

其實floyd求最小環就相當於找出乙個一條只包括1到k 1中節點的路徑,然後把這個路徑與k這個節點相連。這樣是正確的原因是,最小環中一定有乙個最大節點k,當最外層節點是k時,我們一定會列舉到k兩端的兩個節點,這樣就統計出了答案。至於為什麼不能直接用最短路徑,而是要用前k 1個節點跑出來的最短路徑,是...

floyd求最小環

floyd 演算法保證了最外層迴圈到 k 時所有頂點間已求得以 0 k 1 為中間點的最短路徑。乙個環至少有3個頂點,設某環編號最大的頂點為 l 在環中直接與之相連的兩個頂點編號分別為 m 和 n m,n l 則最大編號為 l 的最小環長度即為 graph m,l graph n,l dist m,...