题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1233点击打开链接
题目描述:
还是最小生成树的问题,输出能让村村相通的最小修路总长度。
解题思路:
和那个卡车编号几乎一样,kruscal算法解决。因为有了经验,这次1A了。
AC代码:
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef struct Line
{
int u;
int v;
int w;
};
const int MAXN=110;
int arr[MAXN];
Line lines[MAXN*MAXN/2];
bool cmp(Line a,Line b)
{
return a.w<b.w;
}
int find_father(int x)
{
return x==arr[x]?x:arr[x]=find_father(arr[x]);
}
int main()
{
//freopen("hdu1233.txt","r",stdin);
int n,i,ans;
while(scanf("%d",&n),n)
{
int nn=n*(n-1)/2;
memset(lines,0,sizeof(lines));
ans=0;
for(i=0;i<MAXN;i++)
arr[i]=i;
for(i=0;i<nn;i++)
{
scanf("%d%d%d",&lines[i].u,&lines[i].v,&lines[i].w);
}
sort(lines,lines+nn,cmp);
for(i=0;i<nn;i++)
{
int fu=find_father(lines[i].u);
int fv=find_father(lines[i].v);
if(fv!=fu)
{
arr[fv]=fu;
ans+=lines[i].w;
}
}
printf("%d\n",ans);
}
}
AC截图: