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<stdio.h>
int site[300];
int find(int a)                            //寻找根结点 
{
	if(a!=site[a])
	site[a]=find(site[a]);
	return site[a];
}
void sove(int a,int b)
{
	int x=find(a);
	int y=find(b);
	if(x!=y)
	{
		if(x<y)						//判断两数的根是否相等,不相等的话把小站点赋值给大站点的根,有利于接下去的寻找 
		{
			site[y]=x;
		} 
		else
		{
			site[x]=y;
		}
	} 
}
int main()
{
	int n,m;
	while(scanf("%d %d",&n,&m)!=EOF)
	{
		int a,b;
		for(int i=0;i<300;i++)
		{
			site[i]=i;
		}
		while(m--)
		{
			scanf("%d %d",&a,&b);
			sove(a,b);
		}
		for(int i=0;i<n;i++)
		{
			if(site[i]==i)
			{
				printf("%d",i);							//如果该站点是根直接输出即可 
				for(int j=i+1;j<n;j++)					
				{
					if(find(j)==i)                       //寻找后面站点的根结点是否等于i(不要错写成site[j]==i,此处一开始写错wa了两小时) 
					{
						printf(" %d",j);
					}
				}
				printf("\n");
			}	
		}
		printf("\n");
	}
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值