题目大意:n 个城市由 m 条边连接,每条边有权值,求将所有城市连接起来时的最小权值和。
代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int n,m;
int u[1000010],v[1000010],w[1000010],f[100010],r[1000010];
int cmp(const int x,const int y){
return w[x] < w[y]; // zhuyi <
}
int find(int x){
return x == f[x] ? x : f[x] = find(f[x]);
}
int main(){
int i,j,ans;
while(scanf("%d%d",&n,&m) == 2){
ans = 0 ;
for(i=0;i<m;i++)
scanf("%d%d%d",&u[i],&v[i],&w[i]);
for(i=0;i<m;i++)
r[i] = i;
for(i=0;i<n;i++)
f[i] = i;
sort(r,r+m,cmp);
int cnt = 0;
for(i=0;i<m && cnt <= n;i++){
int x = find(u[r[i]]);
int y = find(v[r[i]]);
if(x == y)
continue;
f[x] = y;
ans += w[r[i]];
cnt ++ ;
}
printf("%d
",ans);
}
return 0;
}