首页 > 学院 > 开发设计 > 正文

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

2019-11-06 07:59:23
字体:
来源:转载
供稿:网友
//感谢师哥指导#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;}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表