1
1
4
1
nop
使用并查集,
做每次归并操作的时候,取2个集合中的最小根结点作为新集合的根节点,并输出该
结点的值。同时可以做路径压缩操作。
代码如下:
#include<stdio.h>
int set[100002],n,m,a,b,t;
void init()
{
int i;
for(i=1;i<=n;i++){
set[i]=i;
}
}
int find2(int x)
{
int r=x,temp;
while(set[x]!=x)
x=set[x];
while(r!=x)
temp=set[r],set[r]=x,r=temp;
return x;
}
void merge2(int a,int b)
{
int ra=find2(a);
int rb=find2(b);
if(ra==rb)
printf("nop\n");
else if(ra<rb){
set[rb]=ra;
printf("%d\n",ra);
}
else{
set[ra]=rb;
printf("%d\n",rb);}
}
int main()
{
scanf("%d",&t);
while(t--){
scanf("%d",&n);
init();
scanf("%d",&m);
while(m--){
scanf("%d %d",&a,&b);
merge2(a,b);
}
}
return 0;
}