公路村村通

来源:互联网 发布:sql server许可模式 编辑:程序博客网 时间:2024/04/27 18:51

公路村村通

//kruscal 算法 #include<stdio.h>#include<string.h>#include<algorithm>using namespace std;int per[1010],n,m;struct node//结构体来保存边{    int a,b;    int dis;}x[5005];bool cmp(node a,node b){    return a.dis<b.dis;}void init()//初始化操作{    for(int i=1;i<=n;++i)    {        per[i]=i;    }}int find(int x)//并查集的查找操作{    int r=x;    while(r!=per[r])    {        r=per[r];    }    int i=x,j;    while(i!=r)    {        j=per[i];        per[i]=r;        i=j;    }    return r;}bool join(int a,int b)//判断某条边是否可以选择{    int x=find(a),y=find(b);    if(x!=y)    {        per[y]=x;        return 1;    }    return 0;}int main(){        scanf("%d%d",&n,&m);        init();        for(int i=1;i<=m;++i)        {            int a,b,c;            scanf("%d%d%d",&a,&b,&c);            x[i].a=a;x[i].b=b;x[i].dis=c;        }        sort(x+1,x+1+m,cmp);//对边进行排序        int sum=0,cnt=0;        for(int i=1;cnt<n&&i<=m;++i)//依次选择使得所有顶点连通的边        {            if(join(x[i].a,x[i].b))            {                sum+=x[i].dis;                ++cnt;            }        }        if(cnt==n-1)            printf("%d\n",sum);//输出最小生成树的权值        else             printf("-1\n");        return 0;}
原创粉丝点击