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