直接上代码
代码
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int pre[1050];
//带路径压缩
int find(int x){
int r=x;
while(r!=pre[r]) r=pre[r];
int i=x,j;
while(pre[i]!=r){
j=pre[i];
pre[i]=r;
i=j;
}
return r;
}
void join(int x,int y){
int fx=find(x),fy=find(y);
if(fx!=fy){
if(fx<fy) pre[fy]=fx;
else pre[fx]=fy;
}
}
int main(){
int num,edgeNum;
cin>>num>>edgeNum;
for(int i=0;i<num;i++) pre[i]=i;
while(edgeNum--){
int a,b;
cin>>a>>b;
join(a,b);
}
for(int i=0;i<num;i++)
cout<<find(i)<<endl;
/*如果用pre[i]的话,
可能还有部分结点在结束循环时还未进行路径压缩
所以如果要找到一个结点的根父结点最好使用find函数
*/
return 0;
}
/*
测试数据:
5 4
0 1
0 3
2 4
0 4
结果:
0
0
0
0
0
如果最后打印使用pre[i]的话,输出就是
0
0
0
0
2
*/