代码参照此博客学习得:https://blog.csdn.net/zjy_code/article/details/80634149
复杂:
#include<iostream>
#include<cmath>
#include<algorithm>
#include<string>
#include<string.h>
using namespace std;
int n,m;
int que[10001];
int dist[10001],sizee[10001];//本题中其实用不到这两个数组,dist表示当前队距离根的距离,sizee表示当前队的人数
int ap;
void init()//初始化
{
for(int i=1;i<=n;i++)
{
que[i]=i;
dist[i]=0;
sizee[i]=1;
}
}
int get(int x)//查找根
{
if(que[x]==x)
return x;
else
{
int y=que[x];
que[x]=get(y);
dist[x]+=dist[y];
return que[x];
}
}
bool mergee(int ap,int b,int c)//判断是否根相同,1时判断并合并,2时判断
{
b=get(b);
c=get(c);
if(ap==1)
{
if(b!=c)
{
que[b]=c;
dist[b]=sizee[c];
sizee[c]+=sizee[b];
return false;
}
else
return true;
}
else
{
if(b!=c)
return false;
else
return true;
}
}
int main()
{
cin>>n>>m;
init();
for(int i=1;i<=m;i++)
{
int bb,cc;
cin>>ap>>bb>>cc;
if(ap==1)
{
bool h=mergee(ap,bb,cc);
}
else if(ap==2)
{
if(mergee(ap,bb,cc))
cout<<"Y"<<endl;
else
cout<<"N"<<endl;
}
}
}