最小生成樹[模板]
題目描述
如題,給出一個無向圖,求出最小生成樹,如果該圖不連通,則輸出 orz。
輸入格式
第一行包含兩個整數表示該圖共有個結點和條無向邊。
接下來行每行包含三個整數,表示有一條長度爲的無向邊連接結點。
輸出格式
如果該圖連通,則輸出一個整數表示最小生成樹的各邊的長度之和。如果該圖不連通則輸出orz。
輸入輸出樣例
輸入
4 5
1 2 2
1 3 2
1 4 3
2 3 4
3 4 3
輸出
7
數據規模
對於 的數據:,
算法
首先,最小生成樹就是在一個有個點的連通圖中取-條邊,使得這-條邊的權值和最小
而求最小生成樹有兩種算法:和算法,而我們這裏先講
其實很容易理解,就是不斷的選取最小邊,前提是這條邊的兩個點之前是未連通的,這樣我們就很輕鬆的用並查集做就行了
代碼展示
的代碼十分簡單,34行代碼十分清爽
#include<bits/stdc++.h>
using namespace std;
struct node
{
int x,y,val;
}a[200010];
int n,m,ans;
int f[5010];
bool Cmp(node x,node y)
{
return x.val<y.val;
}
int find(int x)
{
return f[x]==x?x:f[x]=find(f[x]);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].val);
sort(a+1,a+m+1,Cmp);
for(int i=1;i<=n;i++)f[i]=i;
for(int i=1;i<=m;i++)
{
if(find(a[i].x)!=find(a[i].y))
{
ans+=a[i].val;
f[f[a[i].x]]=f[a[i].y];
}
}
printf("%d\n",ans);
return 0;
}