• HDU1232 畅通工程(并查集)


    某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路? 
    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

    Huge input, scanf is recommended.

    这是一道并查集的入门题, 就酱~

    AC代码:

    #include <stdio.h>
    int par[1005];
    int rank[1005];
    
    int find(int x)
    {
        int r = x;
        while(r!=par[r]) r = par[r];
        int i = x, j;        
        while(i!=r) {   
            j = par[i];   
            par[i] = r;   
            i = j;    
        }
        return r;          
    }
     
    
    void unite(int x, int y)
    {
        x = find(x);
        y = find(y);
        if (x==y) return; 
        
        if (rank[x]<rank[y]) 
            par[x] = y;
        else {
            par[y] = x;
            if (rank[x]==rank[y]) rank[x]++; 
        }
    }
     
    int main()
    {
        int n, m;
        while (~scanf("%d", &n)&&n) {
            scanf ("%d", &m);
            for (int i = 1; i <= n; i++) {
                par[i] = i;
                rank[i] = 0;
            }
            
            int x, y;
            for (int i = 1; i <= m; i++) {
                scanf ("%d%d", &x, &y);
                unite(x, y);
            }
            int cnt = 0; 
            for(int i = 1 ;i <= n ;i++)   //确定连通分量个数  
                if(par[i]==i) cnt++;  
            printf("%d
    ", cnt-1);  
        }
        return 0;
    }
  • 相关阅读:
    高级软件工程第四次作业(C++)
    248&258--高级软件工程第三次作业
    高级软件工程第二次作业--四则运算生成器
    2017282110258--高级软件工程--齐爽爽第一次作业
    一元多项式求导_9
    成绩排名_8
    写这个数 _7
    我要通过_6
    月饼_5
    Hadoop的读写类调用关系_图示
  • 原文地址:https://www.cnblogs.com/wizarderror/p/10752938.html
Copyright © 2020-2023  润新知