最小生成樹問題
給定乙個無向圖,如果它的某個子圖中任意兩個頂點都互相連通,那麼這個圖就叫做生成樹。如果邊上有權值,那麼使得邊權和最小的生成樹叫做最小生成樹(mst)。
但是!!!
如果這個圖不連通呢?
有時題目會讓你自行判斷圖是否連通,若不連通輸出-1,連通輸出權值和。
其實我們只需要加入乙個flag判斷一下就好了
下面是我用kruskal寫的最小生成樹模板並加入了判斷,如果不了解kruskal的原理,(
#includeusingnamespace
std;
#define maxn 300005
#define ll long long
intn,m,t,path,flag;
intf[maxn];
struct
edgea[maxn];
bool
cmp(edge x,edge y)
int find(int
x)void
kruskal()
}}int
main()
Algorithm 最小生成樹之 Kruskal
個人觀點,較prime演算法,kurskal演算法更加的簡單,這裡我們只需要每一次去需找權值最小的那條邊就好,在這裡我們先可以利用sort進行快排,得到權值最小的map i 得到該條邊的兩個節點map i u 和map i v,這時候你需要判斷能不能用這條邊,因為最小生成樹是不能形成迴路,所以用到了...
最小生成樹模板
prim演算法理解可以參考部落格 prim演算法模板 int prime int v int i,j,sum 0,min,k sum是權重和 for i 1 i n i lowcost i 表明當前狀態下在u內距離v點 s中各點 距離的最小值,每個u中點s 中點 都計算 lowcost i map ...
最小生成樹 模板
const int maxn 1010 const int maxm 200020 struct edge edges maxm int father maxn int find int x int cmp edge a,edge b 將邊按權值排序 int kruskal int n,int m ...