題目**
洛谷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 輸出格式 輸出...