码迷,mamicode.com
首页 > 其他好文 > 详细

Intercommunication System

时间:2018-03-05 19:30:45      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:输入数据   灾难   针对   body   man   哪些   ane   new   font   

描述

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

标签:输入数据   灾难   针对   body   man   哪些   ane   new   font   

原文地址:https://www.cnblogs.com/ww123/p/8510672.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!