無向最小環

2021-09-26 20:52:13 字數 1106 閱讀 1353

題目分析:

floyd 演算法保證了最外層迴圈到 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 的迴圈,即可找到整個圖的最小環。、

需要注意的是,當報runtime error (access_violation)錯誤的時候有可能是因為資料讀取出現了問題。把根據邊數讀取寫成了根據點數讀取。

**如下:

/*

* d.cpp

* * created on: 2023年2月7日

* author: administrator

*/ #include #include #include using namespace std;

const int maxn = 110;

const int inf = 1000000;

int dist[maxn][maxn];

int e[maxn][maxn];

int n,m;

void initial()else

} }}

int floyd() }

//根據floyed的原理,在最外層迴圈做了k-1次之後,dis[i][j]則代表了i到j的路徑中所有結點編號都小於k的最短路徑

for(k = 1 ; k <= n ; ++k)}}

//floyd原來的部分,更新dist[i][j]

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

}} }

return mincircle;}

int main()

} int ans = floyd();

if(ans != inf)else }

return 0;

}

模板 最小環

題意 在乙個無向圖里找出乙個由至少三個點組成環,使得環上邊的權值和最小。首先,由於我們的環至少要有三個點,我們就考慮每次列舉環的兩個端點 不關心端點中間有多少個點 再用另外乙個點將這兩個端點連線起來,那麼就一定能夠保證形成乙個至少有三個點的環。想一想,這樣是不是有什麼問題?如果用於連線的點本來就在環...

最小環問題

floyd找最小環 模板 mp i j mp i j mp i j 記錄i ii到j jj的最短路,dis i j dis i j dis i j 代表原始圖的頂點間的關係 非i ii到j jj的最短路 ll ans inf ans為最小環的長度 for int k 1 k n k for int ...

floyd求最小環

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