zoukankan      html  css  js  c++  java
  • hdu1233 继续畅通工程 (最小生成树——并查集)

    还是畅通工程

    Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

    Total Submission(s): 56352    Accepted Submission(s): 25580



    Problem Description
    某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
     
    Input
    测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。
    当N为0时,输入结束,该用例不被处理。
     
    Output
    对每个测试用例,在1行里输出最小的公路总长度。
     
    Sample Input
    
    
    31 2 11 3 22 3 441 2 11 3 41 4 12 3 32 4 23 4 50
     
    Sample Output
    
    
    35
    Hint
    Hint

    Huge input, scanf is recommended.

    思路:

     

    先建立一个结构体类型变量, 里面存在a,b,len 代表着城镇a与城镇b的距离是len

    然后再进行结构体快排(按len从小到大排序)

    最后一步进行遍历,假设存在bin[a],bin[b]的根节点不相等,那么就执行merger(合并),然后sum+=len.

    最后得到的sum就是答案,当然sum首先初始化为0

    附上ac:

    #include<stdio.h>
    #include<stdlib.h>
    #define  min(a,b) a<b?a:b
    struct path{
        int s,e,len;
    }p[5000];
    int f[110];
    int find(int x)
    {
        int r=f[x];
        while(r!=f[r])
            r=f[r];
        return r;
    }
    void merger(int x,int y)
    {
        int fx,fy;
        fx=find(x);
        fy=find(y);
        f[fx]=f[fy]=f[x]=f[y]=min(fx,fy);
    }
    int cmp(const void *a,const void *b)
    {
        return (* (struct path *)a).len-(*(struct path *)b).len;  
    }
    int main()
    {
        int n,i,j,sum;
        while(scanf("%d",&n),n!=0)
        {
            int t=n*(n-1)/2;
            for(i=0;i<t;i++)
                scanf("%d %d %d",&p[i].s,&p[i].e,&p[i].len);
            qsort(p,t,sizeof(p[0]),cmp);
            j=0;
            for(i=1;i<=n;i++)
                f[i]=i;
            sum=0;
            for(i=0;i<t;i++)
            {   
                if(j==n-1)
                    break;
                if(find(p[i].s)==find(p[i].e))
                    continue;
                merger(p[i].s,p[i].e);
                sum=sum+p[i].len;
                j++;   
            }
            printf("%d ",sum);
            /* for (i=0;i<t;i++)
                 printf("%d %d %d ",path[i].a,path[i].b,path[i].l);*/
    }
        return 0;
    }

  • 相关阅读:
    svn cleanup failed–previous operation has not finished 解决方法
    开源SNS社区系统推荐
    从网络获取图片本地保存
    MS SQL Server 数据库连接字符串
    KeepAlive
    Configure Git in debian
    sqlserver query time
    RPi Text to Speech (Speech Synthesis)
    SQL Joins with C# LINQ
    search or reseed identity columns in sqlserver 2008
  • 原文地址:https://www.cnblogs.com/q1204675546/p/9279710.html
Copyright © 2011-2022 走看看