题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=66965#problem/B
题目大意:给你N个点,M条边,求最小生成树。
解题思路:模板题 练速度,一遍准确度。
代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int maxn=2550;
int n,m;
int fa[maxn];
struct Edge{
int u,v,w;
}e[maxn];
bool cmp(const Edge &a,const Edge &b){
return a.w<b.w;
}
int find(int x){
if(x==fa[x]) return x;
return fa[x]=find(fa[x]);
}
int ans;
void Kruskal(){
sort(e+1,e+m+1,cmp);
for(int i=1;i<=m;i++){
int f1=find(e[i].u);
int f2=find(e[i].v);
if(f1!=f2){
ans+=e[i].w;
fa[f1]=f2;
}
}
}
int main(){
while(scanf("%d",&n),n){
scanf("%d",&m);
for(int i=1;i<=n;i++) fa[i]=i;
ans=0;
for(int i=1;i<=m;i++)
scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
Kruskal();
cout<<ans<<endl;
}
}