Kruskal算法
用并查集的一种贪心算法,先把每一个节点当作一棵生成树,按边权从小到大排序,每次枚举最小的边,看是否在同一棵树上
#include<bits/stdc++.h>
using namespace std;
inline int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'|ch>'9'){if(ch == '-') f=-1 ; ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-48 ; ch=getchar();}
return x*f;
}
int n,m;
int f[200010];
struct data{
int u,v,w;
}e[200010];
bool cmp(data x,data y){return x.w < y.w;}
int find(int x){return f[x]==x ? x : f[x] = find(f[x]);} //路径压缩
int ans,cnt;
int flag;
int main(){
n=read();m=read();
for(register int i(1) ; i<=n ; i=-~i) f[i] = i;
for(register int i(1) ; i<=m ; i=-~i) scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
sort(e+1,e+m+1,cmp);
for(register int i(1) ; i<=m ; i=-~i){
if(find(e[i].u) == find(e[i].v)) continue;
f[find(e[i].u)] = find(e[i].v);
ans += e[i].w;
cnt++;
if(cnt == n-1 || cnt == m){
flag = 1;
break;
}
}
if(flag) printf("%d\n",ans);
else printf("orz");
return 0;
}