I - 还是畅通工程
题目描述
有若干个城镇,给出这些城镇两两之间的距离。为使任意两个城镇间都可以实现公路交通(不一定要直连),求修建公路长度的最小值。
题目分析
由题意可知,该题为最小生成树问题,套用Kruskal算法模板即可。
代码
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
struct edge{
int from;
int to;
int dis;
};
int n,temp;
edge ed[5000];
int root[5000];
void root_init()//初始化
{
for(int i=1;i<=n;i++)
root[i]=i;
}
int root_search(int x)//找根
{
while(root[x]!=x){
x=root[x];
}
return x;
}
void root_combine(int a,int b)//将两个集合结合
{
a=root_search(a),b=root_search(b);
if(a!=b) root[b]=a;
}
int kruskal()
{
int length=0;
for(int i=1;i<=temp;i++){
if(root_search(ed[i].from)!=root_search(ed[i].to)){
length+=ed[i].dis;
root_combine(ed[i].from,ed[i].to);
}
}
return length;
}
bool cmp(const edge& e1,const edge& e2)
{
return e1.dis<e2.dis;
}
int main()
{
while(scanf("%d",&n)!=EOF&&n){
root_init();
temp=n*(n-1)/2;
for(int i=1;i<=temp;i++)
scanf("%d%d%d",&ed[i].from,&ed[i].to,&ed[i].dis);
sort(ed+1,ed+temp+1,cmp);
int ans=kruskal();
cout<<ans<<"\n";
}
return 0;
}