最小生成樹 模板

2021-10-25 17:16:42 字數 1230 閱讀 4841

題目**

洛谷p3366 【模板】最小生成樹

題目描述

如題,給出乙個無向圖,求出最小生成樹,如果該圖不連通,則輸出 orz。

輸入格式

第一行包含兩個整數n,m,表示該圖共有n個結點和m條無向邊。

接下來m行,每行包含三個整數xi,yi,zi,表示有一條長度為zi的無向邊連線結點xi,yi。

輸出格式

如果該圖連通,則輸出乙個整數表示最小生成樹的各邊的長度之和。如果該圖不連通則輸出 orz。

輸入樣例

4 51 2 2

1 3 2

1 4 3

2 3 4

3 4 3

輸出樣例

7說明

資料規模

1<=n<=5000, 1<=m<=2e5;

解題方法

這是乙個典型的最小生成樹模板題,我的做法是使用普通的kruskal演算法解題,其中還需要使用到並查集的知識。

這裡簡單說一下kruskal演算法,這個演算法其實是一種貪心思想。現將所有邊的權值進行乙個從小到大的排列,然後按照順序進行選取,當給出的兩個點不屬於同乙個集合時,就將他們合併,否則就跳過。直到所有點(假設為n個)都屬於同乙個集合(這時只會有n-1條邊)。至於查詢是否屬於同乙個集合,以及如何將兩個點合併為同乙個集合,這便涉及到了並查集演算法。簡而言之,kruskal演算法其實就是基於並查集的一種貪心思想。

#include

using

namespace std;

typedef

long

long ll;

const

int n =

2e5+5;

struct nodea[n]

;int fa[n]

;int n, m, x, y, tot;

ll ans;

void

init

(int n)

intfind

(int x)

void

kruskal()

}bool

cmp(node x, node y)

intmain()

最小生成樹模板

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

模板 最小生成樹

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