描述:
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;
}