題目描述
如題,給出乙個無向圖,求出最小生成樹,如果該圖不連通,則輸出orz
輸入輸出格式
輸入格式:
第一行包含兩個整數n、m,表示該圖共有n個結點和m條無向邊。(n<=5000,m<=200000)
接下來m行每行包含三個整數xi、yi、zi,表示有一條長度為zi的無向邊連線結點xi、yi
輸出格式:
輸出包含乙個數,即最小生成樹的各邊的長度之和;如果該圖不連通則輸出orz
輸入輸出樣例
輸入樣例#1: 複製
4 51 2 2
1 3 2
1 4 3
2 3 4
3 4 3
輸出樣例#1: 複製7說明
時空限制:1000ms,128m
資料規模:
對於20%的資料:n<=5,m<=20
對於40%的資料:n<=50,m<=2500
對於70%的資料:n<=500,m<=10000
對於100%的資料:n<=5000,m<=200000
樣例解釋:
所以最小生成樹的總邊權為2+2+3=7
思路:
這道題用最小生成樹來做,prim演算法我不是很熟悉,所以我來講講kruskal演算法。
kruskal演算法也就是並查集做法,演算法思路:
將圖中的所有邊都去掉。
將邊按權值從小到大的順序新增到圖中,保證新增的過程中不會形成環
重複上一步直到連線所有頂點,此時就生成了最小生成樹。這是一種貪心策略。
這道題就是這樣的思路,在注釋中也會有所體現。
源**:
#include
using
namespace std;
int n,m;
struct nodeg[
200010];
bool
cmp(node a,node b)
//排序函式
int fa[
10010];
void
init()
}//初始化
intget
(int x)
else
}//找根
intmain()
//輸入
init()
;sort
(g+1
,g+1
+m,cmp)
;//排序,為後面的貪心思想做準備
int cnt=0;
for(
int i=
1;i<=m;i++)}
cout<
return0;
}
P3366 模板 最小生成樹
如題,給出乙個無向圖,求出最小生成樹,如果該圖不連通,則輸出orz 輸入格式 第一行包含兩個整數n m,表示該圖共有n個結點和m條無向邊。n 5000,m 200000 接下來m行每行包含三個整數xi yi zi,表示有一條長度為zi的無向邊連線結點xi yi 輸出格式 輸出包含乙個數,即最小生成樹...
P3366 模板 最小生成樹
如題,給出乙個無向圖,求出最小生成樹,如果該圖不連通,則輸出orz 輸入格式 第一行包含兩個整數n m,表示該圖共有n個結點和m條無向邊。n 5000,m 200000 接下來m行每行包含三個整數xi yi zi,表示有一條長度為zi的無向邊連線結點xi yi 輸出格式 輸出包含乙個數,即最小生成樹...
P3366 模板 最小生成樹
如題,給出乙個無向圖,求出最小生成樹,如果該圖不連通,則輸出orz 輸入格式 第一行包含兩個整數n m,表示該圖共有n個結點和m條無向邊。n 5000,m 200000 接下來m行每行包含三個整數xi yi zi,表示有一條長度為zi的無向邊連線結點xi yi 輸出格式 輸出包含乙個數,即最小生成樹...