合并和查询操作:
第一行包含两个整数N、M,表示共有N个元素和M个操作。
接下来M行,每行包含三个整数Zi、Xi、Yi
当Zi=1时,将Xi与Yi所在的集合合并
当Zi=2时,输出Xi与Yi是否在同一集合内,是的话输出Y;否则话输出N
输出格式:
如上,对于每一个Zi=2的操作,都有一行输出,每行包含一个大写字母,为Y或者N
输入样例#1:
4 7
2 1 2
1 1 2
2 1 2
1 3 4
2 1 4
1 2 3
2 1 4
输出样例#1:
N
Y
N
Y
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#define maxn 300005
#define ll long long
using namespace std;
ll f[maxn]; //存放各点祖宗节点的数组;
ll find(ll x) //查找老大是谁;
{
if(f[x]==x)
return x;
else
return f[x]=find(f[x]); //这里是路径压缩,把递归过程中遇到的结点的祖宗结点也直接修改了
//也就是使途中经过的人的大哥也变成老大。
}
int main()
{
ll i,j,n,m,k,s,x,y;
scanf("%lld %lld",&n,&m);
for(i=1;i<=n;i++)
f[i]=i; //初始化,定义每个点的老大都是它自身;
for(i=1;i<=m;i++)
{
scanf("%lld %lld %lld",&s,&x,&y);
if(s==1)
f[find(x)]=find(y); //y打赢了x,所以y的老大就是x的老大了;
else
{
if(find(x)==find(y)) //判断x和y的老大是不是同一个人;
printf("Y\n");
else
printf("N\n");
}
}
return 0;
}