最小生成树之Kruskal算法 HDU 1233 还是畅通工程

//感谢师哥指导
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int n,m;
int x,y;
int ans;
int abw;
int sum;
int a[10000+5];
struct stu
{
    int z;
    int w;
    int g;
};
stu p[10000+5];
int cmp(stu a,stu b)
{
    return a.g<b.g;
}//运用于sort的结构体排序函数
int text()
{
    for(int i=1;i<=n;i++)
    {
        a[i]=i;
    }
    return 0;
}
int getf(int v)
{
    if(a[v]==v)
    {
        return v;
    }
    else
    {
        a[v]=getf(a[v]);
        return a[v];
    }
}
int merg(int v,int u)
{
    int t1,t2;
    t1=getf(v);
    t2=getf(u);
    if(t1!=t2)
    {
        a[t2]=t1;
        return 1;
    }
    return 0;
}
int main()
{
    memset(p,0,sizeof(p));//将结构体内部元素全部清零
    /*for(int i=0;i<10;i++)
    {
        cout<<p[i].z<<' '<<p[i].w<<endl;
    }*/
    while(scanf("%d",&n)&&n)
    {
        abw=0;
        sum=0;
        text();
        ans=n*(n-1)/2;
        for(int i=0;i<ans;i++)
        {
            scanf("%d%d%d",&p[i].z,&p[i].w,&p[i].g);
        }
        stable_sort(p,p+ans,cmp);//进行排列,便于从最小节点开始
        for(int i=0;i<ans;i++)
        {
            if(merg(p[i].z,p[i].w))
            {
                sum+=p[i].g;
                abw++;
            }//依次讨论是否在同一集合,如果不是则增加sum
            if(abw==n)break;//判断是否达到数据要求
        }
        PRintf("%d\n",sum);
    }
    return 0;
}