题目描述
如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出orz
输入输出格式
输入格式:第一行包含两个整数N、M,表示该图共有N个结点和M条无向边。(N<=5000,M<=200000)
接下来M行每行包含三个整数Xi、Yi、Zi,表示有一条长度为Zi的无向边连接结点Xi、Yi
输出格式:
输出包含一个数,即最小生成树的各边的长度之和;如果该图不连通则输出orz
输入输出样例
输入样例#1:
4 5 1 2 2 1 3 2 1 4 3 2 3 4 3 4 3
输出样例#1:
7
说明
时空限制:1000ms,128M
数据规模:对于100%的数据:N<=100000,M<=200000
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
struct XY{ll u,v,w;}e[1000000];
ll n,m,j=1,cnt=0,ans=0;
ll father[1000000];
bool cmp(XY a,XY b){
return a.w<b.w;
}
ll sf(ll d){
if (d==father[d]) return d;
father[d]=sf(father[d]);return father[d];
}
int main(){
cin >>n>>m;
for (ll i=1;i<=m;++i) cin >>e[i].u>>e[i].v>>e[i].w;
for (ll i=1;i<=n;++i) father[i]=i;
sort(e+1,e+1+m,cmp);
while (cnt<n-1){
ll f1=sf(e[j].u),f2=sf(e[j].v);
if (f1!=f2){ans+=e[j].w;father[f1]=f2;++cnt;}
++j;
}
cout <<ans<<endl;
return 0;
}