Intercommunication System

Posted ww123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Intercommunication System相关的知识,希望对你有一定的参考价值。

描述

2010年是xx国一个多灾多难的一年,灾难使该国的通讯系统遭到了重创,全国共有n个通讯站点,分别从0到n-1进行编号,通讯部门对每两个站点的线路进行了检测,现在要你确定有哪些站点是彼此连通的。

输入

输入数据有多组,每组数据的第一行包含两个整数n和m,其中n为通讯站点个数,接下来有m行,每一行有2个整数a和b,表示站点a和b通讯正常。其中1<=n<=250。
输入以EOF结束。

输出

针对每组输入,将所有连通的站点进行分组,并将每组按照站点从小到大的顺序输出,如果有多组,所有的组根据每组最小的站点编号进行从小到大的排序后输出。
每组数据输出之后加一个空行

样例输入

3 3
0 1
1 2
0 2
5 1
0 2

样例输出

0 1 2

0 2
1
3
4

解题思路:由于要按从小到大排序,并查集的 父节点需要指向小的。

#include <iostream>
using namespace std;
#include <algorithm>
int p[251];  //父节点
int find(int x)
{
    if(x!=p[x])
        p[x]=find(p[x]);
    return p[x];
}
int main()
{
    int n,m,i,j,k;
    std::ios::sync_with_stdio(false);  //加速cin的读入
    while(cin>>n>>m){
        for(i=0;i<n;i++){
            p[i]=i;
        }//初始化
        for(i=0;i<m;i++){
            int a,b;
            cin>>a>>b;
            int x=find(a);
            int y=find(b);
            if(x!=y){
                if(x<y)
                    p[y]=x;
                else p[x]=y;
            }  //父节点指向小的
        }
        for(i=0;i<n;i++){
            if(p[i]==i){
                cout<<i;
                for(j=i+1;j<n;j++){
                    if(find(j)==find(i))
                        cout<<" "<<j;
                }
                cout<<"\n";
            }
        }
        cout<<"\n";


    }

    return 0;
}

 

以上是关于Intercommunication System的主要内容,如果未能解决你的问题,请参考以下文章

从 'System.Int32' 到 'System.Nullable`1[[System.Int32, mscorlib]] 的无效转换

获取 System.Collections.Generic.List1[System.Collections.Generic.KeyValuePair2[System.Int32,System.Str

System.TypeLoadException:“无法从程序集“System.Web”加载类型“System.Web.HttpContextBase”,

java中System.out.print()与System.out.println()与System.out.printf()的差别

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.

从 System.Collections.Generic.Dictionary`2[System.Object,System.Object] 读取数据