题目链接:https://www.luogu.com.cn/problem/P3366
tip:作为队伍的数据结构选手,来记录一下模板题供以后比赛前复习~~~(其实是队友太懒了)
题解:这边用了kruskal算法,首先将边权从小到大排序后,再遍历每一条边,用并查集检查当前遍历到的边的两端节点是否已经连通,若不连通则加入到集合中,最后判断一下边是否是节点的数量-1即可。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+10;
typedef struct{
int x,y,z;
}node;
node e[maxn];
int n,m,f[maxn];
bool cmp(node a,node b){
return a.z<b.z;
}
void init(){
for(int i=0;i<=n;i++) f[i]=i;
}
int find(int x){
while(x!=f[x]) x=f[x];
return x;
}
int main()
{
cin>>n>>m;
init();
int x,y,z;
for(int i=0;i<m;i++){
cin>>x>>y>>z;
e[i].x=x;e[i].y=y;e[i].z=z;
}
sort(e,e+m,cmp);ll ans=0;int bian=0;
for(int i=0;i<m;i++){
x=find(e[i].x);y=find(e[i].y);
if(x==y) continue;
if(x>y) swap(x,y);
f[y]=x;ans+=e[i].z;bian++;
}
if(bian==n-1) cout<<ans;
else cout<<"orz";
return 0;
}