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;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章