思路
与<15108道路建设>同解,Kruskal硬过就行了。
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=100005,maxm=1000005;
struct E{
int from,next,to,dis;
}edge[maxm*2];
int n,m,u,v,w;
int head[maxn],cnt=0,fa[maxn];
int find(int x){
if(fa[x]==x) return x;
else return fa[x]=find(fa[x]);
}
void unite(int x,int y){
fa[find(x)]=find(y);
}
void addedge(int from,int to,int dis){
edge[++cnt].next=head[from];
edge[cnt].from=from;
edge[cnt].to=to;
edge[cnt].dis=dis;
head[from]=cnt;
}
bool cmp(E a,E b){
return a.dis<b.dis;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&u,&v,&w);
addedge(u,v,w);
addedge(v,u,w);
}
int tot=0,sm=0;
for(int i=1;i<=n;i++) fa[i]=i;
sort(edge+1,edge+1+cnt,cmp);
for(int i=1;i<=cnt;i++){
if(find(edge[i].to)!=find(edge[i].from)){
sm+=edge[i].dis;
unite(edge[i].to,edge[i].from);
tot++;
}
if(tot==n-1) break;
}
cout<<sm<<endl;
return 0;
} 
京公网安备 11010502036488号