用kruskal 来了一发,卧槽,排序的时候把边的数目和点的数目搞混了,又wrong了
#include<bits/stdc++.h>
using namespace std;
int cot;
int n;
int sum;
struct edge
{
int x;
int y;
int w;
}a[100005];
int fa[1056];
void init()
{
int i;
for(i=1;i<=n;i++)
fa[i]=i;
return ;
}
int findd(int x)
{
int s;
for(s=x;s!=fa[s];s=fa[s])
;
int tmp;
while(s!=x)
{
tmp=fa[x];
fa[x]=s;
x=tmp;
}
return s;
}
bool cmp(edge a,edge b)
{
return a.w<b.w;
}
void Union(edge he)
{
int r1=findd(he.x);
int r2=findd(he.y);
if(r1!=r2)
{
cot++;
sum+=he.w;
fa[r1]=r2;
}
return ;
}
void kruskal()
{
int i;
init();
sort(a,a+n*(n-1)/2,cmp);//一开始用的n,wrong还不知道怎么回事
for(i=0;i<n*(n-1)/2;i++)
{
Union(a[i]);
if(cot==n-1)
break;
}
return;
}
int main()
{
std::ios::sync_with_stdio(false);
while(cin>>n)
{
if(n==0)
break;
cot=0;
sum=0;
int i,j,k;
int x,y,z;
for(i=0;i<n*(n-1)/2;i++)
{
cin>>x>>y>>z;
a[i].x=x;
a[i].y=y;
a[i].w=z;
}
kruskal();
cout<<sum<<endl;
}
}