最小生成樹的常用演算法模板

2022-01-10 10:20:38 字數 952 閱讀 5880

關於最小生成樹的話,其實很早之前就接觸了,當時也寫了一篇關於最小生成樹的文章,但一直沒有好好刷題。

接下來幾天會持續更新維護kb-最小生成樹專題

最小生成樹的演算法沒有其他演算法那麼複雜,演算法思想比較簡單,**也比較容易。

常見的最小生成樹演算法由kruskal演算法和prim演算法。

演算法思想:

建立乙個並查集,每個點構成乙個集合;

將邊進行從小到大進行排序,依次掃瞄邊edge(u,v,w);

如果u和v 屬於同乙個集合,那麼跳過這輪迴圈;

如果不屬於同乙個集合,則把u、v合併為同乙個集合;

當集合中的頂點數為n或者掃遍所有邊edge,則構成最小生成樹。

#include#include#includeusing namespace std;

const int manx=1e5+5; //對應頂點數目

const int mamx=1e5+5; //對應邊的數目

int n,m,u,v,total=1;

struct edgebian[mamx];

int a[manx];

long long ans;

int find(int x) //並查集

bool cmp(edge x,edge y)

e[mamx];

typedef pairp;

priority_queue,greater>q; //堆優化

void add(int u, int v, int w) //鏈式前向星建圖

int main()

dis[1]=0; //一般將1作為最小生成樹擴充套件的起點

q.push(make_pair(0,1));

while(!q.empty() && cnt儘管堆優化,但不如直接使用kruskal演算法更加方便,因此,稀疏圖用kruskal,稠密圖用prim 。

最小生成樹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 輸出格式 輸出包含乙個數,即最小生成樹的各邊...