第一行有两个n, m。表示集合的个数与操作的个数。
接下来有m行,每行有以下两种操作的其中一种。
U x y 将集合x与集合y合并
Q x y 询问集合x与集合y是否被合并在了一起,如果已被合并在一起输出Y,否则输出N。
Sample Input:
4 9
Q 1 2
U 1 2
Q 1 2
Q 3 4
U 3 4
Q 3 4
Q 2 4
U 1 3
Q 2 4
Sample Output:
N
Y
N
Y
N
Y
Hint:
对于80%的数据1 <= n, m <= 1000
对于100%的数据1 <= n, m <=1000000
#include<stdio.h>
int gat[1000001];
int gather(int i)
{
int temp;
if(gat[i]==i)
temp=i;
else
{
temp=gather(gat[i]);
gat[i]=temp;
}
return temp;
}
int join(int i, int j)
{
int gati, gatj;
gati = gather(i);
gatj = gather(j);
if (gati != gatj)
{
gat[gatj] = gati;
gather(j);
return 1;
}
return 0;
}
int main()
{
int num1,num2,n1,n2;
char ch;
scanf("%d %d",&num1,&num2);
for(int i=0;i<=num1;i++)
gat[i]=i;
for(int i=0;i<2*num2;i++)
{
scanf("%c %d %d",&ch,&n1,&n2);
if(ch=='U')
join(n1,n2);
if(ch=='Q')
{
if(gather(gat[n1])==gather(gat[n2]))
printf("Y\n");
else
printf("N\n");
}
}
return 0;
}