• [并查集] 畅通工程


    题目描述

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

    输入

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

    输出

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

    样例输入

    5 3 1 2 3 2 4 5 0

    样例输出

    1
     
     
    #include <iostream>
    #include <cstdio>
    #include <cmath>
    #include <cstring>
    #include <algorithm>
    #include <vector>
    using namespace std;
    
    int f[1010];
    
    void init()
    {
        for(int i=0;i<1010;i++)
        {
            f[i]=i;
        }
    }
    
    int findFather(int x)
    {
        while(x!=f[x])
        {
            x=f[x];
        }
        return x;
    }
    
    int cnt=0;
    
    void unionf(int a,int b)
    {
        int fa=findFather(a);
        int fb=findFather(b);
        if(fa!=fb)
        {
            cnt-=1;;
            f[fa]=fb;
        }
    }
    
    int main()
    {
        int n,m;
        while(cin>>n)
        {
            if(n==0) break;
            cin>>m;
            init();
            cnt=n;
            int a,b;
            for(int i=0;i<m;i++)
            {
                scanf("%d%d",&a,&b);
                unionf(a,b);
            }
            printf("%d
    ",cnt-1);
        }
    }
  • 相关阅读:
    正则表达式之断言
    认识CSS中标题引入icon图标
    认识CSS中字体图标
    认识CSS中精灵技术(sprite)和滑动门
    认识CSS中高级技巧之用户界面样式
    认识CSS中高级技巧之元素的显示与隐藏
    认识CSS中布局之文档流、浮动、定位以及叠放次序
    正则表达式之括号
    正则表达式之量词
    正则表达式之字符组
  • 原文地址:https://www.cnblogs.com/xiongmao-cpp/p/6433385.html
Copyright © 2020-2023  润新知