題目分析:
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 的最短路徑...