zoukankan      html  css  js  c++  java
  • HDU 1232 畅通project

    Problem Description
    某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通project”的目标是使全省不论什么两个城镇间都能够实现交通(但不一定有直接的道路相连。仅仅要互相间接通过道路可达就可以)。问最少还须要建设多少条道路? 
     

    Input
    測试输入包括若干測试用例。每一个測试用例的第1行给出两个正整数,各自是城镇数目N ( < 1000 )和道路数目M。随后的M行相应M条道路。每行给出一对正整数,各自是该条道路直接连通的两个城镇的编号。为简单起见。城镇从1到N编号。 
    注意:两个城市之间能够有多条道路相通,也就是说
    3 3
    1 2
    1 2
    2 1
    这样的输入也是合法的
    当N为0时,输入结束,该用例不被处理。 
     

    Output
    对每一个測试用例,在1行里输出最少还须要建设的道路数目。 
     

    Sample Input
    4 2 1 3 4 3 3 3 1 2 1 3 2 3 5 2 1 2 3 5 999 0 0
     

    Sample Output
    1 0 2 998
    题意:中国人民都知道了
    思路:还是运用到了并查集的知识,将相互有道路连接的城市放到一个集合里面去,代码里有解释。
    #include<stdio.h>
    int sum,f[1005];    //sum为题目所求
    int find(int x)     //寻找根节点
    {
        if(f[x]!=x)
            f[x]=find(f[x]);
        return f[x];
    }
    void  make(int x,int y) 
    {
        int f1=find(x);
        int f2=find(y);
        if(f1!=f2)  //每次输入的是相互连通的城市。所以把2个城市放到一个节点里面去
        {
            f[f1]=f2;
            sum--;
        }
    }
    int main()
    {
        int n,m,i;
        while(scanf("%d",&n)!=EOF)
        {
            if(n==0)break;
            scanf("%d",&m);
            sum=n;
            for(i=1;i<=n;i++)   //初始化根节点
                f[i]=i;
            for(i=1;i<=m;i++)
            {
                int a,b;
                scanf("%d %d",&a,&b);
                make(a,b);
            }
            printf("%d
    ",sum-1);
        }
        return 0;
    }
    


  • 相关阅读:
    mac上python3安装HTMLTestRunner
    双目深度估计传统算法流程及OpenCV的编译注意事项
    深度学习梯度反向传播出现Nan值的原因归类
    1394. Find Lucky Integer in an Array
    1399. Count Largest Group
    1200. Minimum Absolute Difference
    999. Available Captures for Rook
    509. Fibonacci Number
    1160. Find Words That Can Be Formed by Characters
    1122. Relative Sort Array
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/6756608.html
Copyright © 2011-2022 走看看