板子题 直接最小生成树一拍就行了
稍后会讲mst
#include<algorithm>
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int n;
struct Line
{
int u,v,w;
bool operator<(const Line b)const
{
return this->w<b.w;
}
}line[5050];
int f[150];
int find(int x)
{
return (f[x]==x)?x:find(f[x]);
}
int mst(int start)
{
for(int i=1;i<=n;i++)
{
f[i]=i;
}
int cnt=0;
int len=0;
for(int i=start;i<=n*(n-1)/2&&cnt<=(n-1);i++)
{
int x=find(line[i].u);
int y=find(line[i].v);
if(x!=y)
{
f[y]=x;
len+=line[i].w;
cnt++;
}
}
return len;
}
int main()
{
while(scanf("%d",&n),n)
{
for(int i=1;i<=n*(n-1)/2;i++)
{
scanf("%d%d%d",&line[i].u,&line[i].v,&line[i].w);
}
sort(line+1,line+1+n*(n-1)/2);
int ans=mst(1);
printf("%d\n",ans);
}
return 0;
}