最小生成樹演算法及模板

2022-05-01 17:51:09 字數 1166 閱讀 5618

最小生成樹演算法分為

1.prime演算法 o(n^2)

由點到邊,每次將到集合距離最短的集合外的點加入集合中,在鬆弛集合外的點到集合的距離;

2.kruskal 0(mlogm)

將邊從小到大排序,迴圈每一條邊,如果兩點未在同一集合裡(並查集維護),則將該邊加入集合中;

稠密圖用prime,稀疏圖用kruskal

prime

#include#include

#include

using

namespace

std;

const

int inf=0x3f3f3f3f

;int

n,m;

int g[510][510

];int dist[510];int vis[510

];int

prime()

return

res;

}int

main()

int t=prime();

if(t==0x3f3f3f3f)printf("

impossible\n");

else

printf(

"%d\n

",t);

return0;

}

kruskal()

#include#include

using

namespace

std;

intn,m;

int p[200010

];struct

node

}edge[

200010

];int find(int

x)int

main()

sort(edge,edge+m);

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

p[i]=i;int res=0,cnt=0;//

cnt存加入集合的邊數

for(int i=0;i//

對每一條邊操作

if(cnt1)printf("

impossible\n");

else

printf(

"%d\n

",res);

return0;

}

最小生成樹Kruskal演算法模板

利用陣列fa來記錄各個節點的父節點,初始化為自己 通過sort排序,從邊長最短到最長 for 邊長 判斷 如果邊的兩個端點的父節點不相同,可選 把選過的邊的兩端點中,大序號的父節點處理為小序號的父節點 include include using namespace std define n 28 i...

最小生成樹 Prim演算法(模板)

基本演算法 首先以乙個結點作為最小生成樹的初始結點,然後以迭代的方式找出與最小生成樹中各結點權重最小邊,並加入到最小生成樹中。選擇一條權值最小,且一端點a已加入生成樹,另一端點b在剩餘結點集內的邊作為最小生成樹上的邊,同時將b列入生成樹的已有點集中。當所有結點都加入到最小生成樹中之後,就找出了連通圖...

模板 最小生成樹 kruskal演算法

題目描述 如題,給出乙個無向圖,求出最小生成樹 輸入輸出格式 輸入格式 第一行包含兩個整數n m,表示該圖共有n個結點和m條無向邊。n 5000,m 200000 接下來m行每行包含三個整數xi yi zi,表示有一條長度為zi的無向邊連線結點xi yi 輸出格式 輸出包含乙個數,即最小生成樹的各邊...