HDU-1233 还是畅通工程

时间:2023-03-09 13:05:38
HDU-1233 还是畅通工程
Problem Description
某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省*“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
Input
测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。
当N为0时,输入结束,该用例不被处理。
Output
对每个测试用例,在1行里输出最小的公路总长度。
Sample Input
3
1 2 1
1 3 2
2 3 4
4
1 2 1
1 3 4
1 4 1
2 3 3
2 4 2
3 4 5
Sample Output
3
5
模板如下
AC代码:(经供参考)
  #include<cstdio>
#include<algorithm> using namespace std; int f[]; typedef struct e
{
int a,b,w;
}eg;
eg e[]; int cmp(eg x,eg y)
{
if(x.w<y.w)
return ;
return ;
} int find_set(int x)
{
if(x!=f[x])
f[x]=find_set(f[x]);///找到头 return f[x];
} int main()
{
int n,m,z,x,y,i; while(scanf("%d",&n)&&n)
{
for(i=;i<=n;i++)
f[i]=i; m=;
z=n*(n-)/; for(i=;i<z;i++)
scanf("%d%d%d",&e[i].a,&e[i].b,&e[i].w); sort(e,e+z,cmp); for(i=;i<z;i++)
{
x=find_set(e[i].a);
y=find_set(e[i].b); if(x!=y)
{
f[y]=x;
m+=e[i].w;
}
}
printf("%d\n",m);
}
return ;
}

自己必须要再敲一遍

 #include<cstdio>
#include<algorithm> using namespace std; int p[]; struct data
{
int x, y, money;
}v[]; int cmp(data a, data b)
{
return a.money < b.money;
} int Find(int x)
{
if (x != p[x])
p[x] = Find(p[x]); return p[x];
} int main()
{
int n; while(scanf ("%d", &n), n != )
{ int i, z = n*(n-)/; for (i = ; i <= n; i++)
p[i] = i; for (i = ; i < z; i++)
scanf ("%d %d %d", &v[i].x, &v[i].y, &v[i].money); sort(v, v+z, cmp); int a, b, num = ; for (i = ; i < z; i++)
{
a = Find(v[i].x);
b = Find(v[i].y); if (a != b)
{
p[b] = a;
num += v[i].money;
}
} printf("%d\n", num); }
return ;
}

相关文章