题目描述
如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出 orz。
PS:测试数据有问题,没有不连通的点
#include <bits/stdc++.h>
using namespace std;
struct Node{
int x,y,z;
bool operator <(const Node& b){
return z<b.z;
// 根据结构体某个元素重构结构体顺序
}
}a[200005] ;
int ans;
int bk[200005];
int getf(int i){
if(i==bk[i])
return i;
return bk[i]=getf(bk[i]);
}
void mer(int i){
int f1=getf(a[i].x),f2=getf(a[i].y);//寻找源头
if(f1==f2)//若源头相同则已是最优解,不需要合并
return;
bk[f2]=f1;//合并数
ans+=a[i].z;//计和
return ;
}
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>a[i].x>>a[i].y>>a[i].z;
bk[i]=i;
}
sort(a+1,a+m+1);//结构体排序
for(int i=1;i<=m;i++){//建树
mer(i);
}
cout<<ans<<endl;
return 0;
}