输入格式
第一行包含两个整数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 <stdio.h>
#define N 10001
int pre[N];
void init(int n) //初始化函数,对录入的N个结点进行初始化
{
for(int i=0;i<n;i++)
{
pre[i]=i;//每个结点的上级都是自己
}
}
int find (int x)//改进查找算法:完成路径压缩,将 x的上级直接变为根结点,那么树的高度就会大大降低
{
if(pre[x]==x) return x;//递归出口,x的上级为x本身,则x为根结点
return pre[x]=find(pre[x]);//此代码相当于先找到根结点
}
void unionn(int i,int j)
{
int i_pre=find(i); //找到i的上级
int j_pre=find(j); //找到j的上级
pre[i_pre]=j_pre; //i的上级指向j
}
int main()
{
int n,m,x,y,z;
scanf("%d",&n);
init(n);
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
scanf("%d %d %d",&z,&x,&y);
if(z==2)
{
if(find(x)==find(y))
printf("Y\n");
else
printf("N\n");
}
if(z==1)
{
unionn(x,y);
}
}
return 0;
}