模板 最小生成樹優化版(Kruskal)

2022-04-29 21:00:10 字數 607 閱讀 9591

最小生成樹問題

給定乙個無向圖,如果它的某個子圖中任意兩個頂點都互相連通,那麼這個圖就叫做生成樹。如果邊上有權值,那麼使得邊權和最小的生成樹叫做最小生成樹(mst)。

但是!!!

如果這個圖不連通呢?

有時題目會讓你自行判斷圖是否連通,若不連通輸出-1,連通輸出權值和。

其實我們只需要加入乙個flag判斷一下就好了

下面是我用kruskal寫的最小生成樹模板並加入了判斷,如果不了解kruskal的原理,(

#includeusing

namespace

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 ...