您的位置:首页 > 编程语言 > Go语言

HDU 1863 畅通工程

2014-05-08 19:51 316 查看

杭电 1863 畅通工程

题目是中文,就不用多说了.

#include<stdio.h>
#include<algorithm>  //算法,sort
using namespace std;
struct engin{
int a,b,c;
}bug[5000];
int p[2000],cc,n,m;
int cmp(engin x,engin y)
{
return x.c<y.c;
}
int find(int x)
{
return p[x]==x?p[x]:find(p[x]);
}
void kruskal()
{
int i,sum=0;
for(i=1;i<=m;i++)//父节点数组初始化
p[i]=i;
sort(bug+1,bug+n+1,cmp);
for(i=1;i<=n;i++)
{
int x=find(bug[i].a);
int y=find(bug[i].b);
if(x!=y)
{
cc++;
sum+=bug[i].c;
p[x]=y;
}
}
if(cc==m)
printf("%d\n",sum);
else
printf("?\n");
}
int main()
{
while(scanf("%d%d",&n,&m)&&n)
{
int i;
cc=1;
for(i=1;i<=n;i++)
scanf("%d%d%d",&bug[i].a,&bug[i].b,&bug[i].c);
kruskal();
}
return 0;
}

用的方法是kruskal.

通过建立结构体 来保存输入.

按权值大小进行排序,建立一个用于保存父节点是多少的数组,数组初始为各自本身.通过find函数来找父节点,当所有村庄的p数组值相同就说明所有村庄都已经链接在一起了,当然也可以通过一个变量cc来统计中间连接村庄的次数.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  algorithm kruskal 算法