hdu1233: http://acm.hdu.edu.cn/showproblem.php?pid=1233
题意:全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
解法:最小生成树:Kruskal
code:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
int v[10000],k[10000],w[10000],r[10000],fa[200];
int find(int a)
{
return fa[a]==a?a:a=find(fa[a]);
}
int cmp(int i,int j)
{
return w[i]<w[j];
}
int main()
{
int n,ans,x,y;
while(1)
{
ans=0;
scanf("%d",&n);
if(n==0)break;
for(int i=0;i<(n*(n-1))/2;i++)
{
scanf("%d%d%d",&v[i],&k[i],&w[i]);
v[i]=v[i]-1;k[i]=k[i]-1;
r[i]=i;
}
for(int i=0;i<n;i++)
{
fa[i]=i;
}
sort(r,r+(n*(n-1))/2,cmp);
for(int i=0;i<(n*(n-1))/2;i++)
{
x=find(v[r[i]]);
y=find(k[r[i]]);
if(x!=y)
{
ans=ans+w[r[i]];
fa[x]=y;
}
}
printf("%d\n",ans);
}
}
/*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
0
output:
3
5*/