并查集(路径压缩)
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <string>
#include <algorithm>
#define error -1
#define ok 1
using namespace std;
typedef long long ll;
const int maxn = 10005 ;
int arr[ 2 * maxn] ;
int ran[ 2 * maxn] ;
int box[ 2 * maxn] ;
int inde = 0 , m;
int setnum = 0 ;
void ini ( int n) {
for ( int i= 0 ; i<= 2 * n; i++ ) {
arr[ i] = i;
box[ i] = i;
ran[ i] = 1 ;
}
setnum = m;
inde = n + 1 ;
}
int Find1 ( int x) {
int r = x;
while ( r != arr[ r] )
r = arr[ r] ;
int i = x, j;
while ( arr[ i] != r) {
j = arr[ i] ;
arr[ i] = r;
i = j;
}
return r;
}
int Find2 ( int x) {
if ( arr[ x] != x) {
arr[ x] = Find2 ( arr[ x] ) ;
}
return arr[ x] ;
}
int Find3 ( int x) {
return x == arr[ x] ? x : arr[ x] = Find3 ( arr[ x] ) ;
}
void Merge1 ( int x, int y) {
int fx = Find1 ( x) , fy = Find1 ( y) ;
if ( fx != fy)
arr[ fx] = fy;
return ;
}
void Merge2 ( int x, int y) {
int fx = Find1 ( x) , fy = Find1 ( y) ;
if ( fx != fy) {
if ( ran[ fx] >= ran[ fy] ) {
arr[ fy] = fx;
ran[ fx] + = ran[ fy] ;
}
else {
arr[ fx] = fy;
ran[ fy] + = ran[ fx] ;
}
}
}
void del ( int x)
{
int fx = Find3 ( box[ x] ) ;
if ( ran[ x] != 1 ) setnum++ ;
arr[ inde] = box[ x] = inde;
ran[ inde++ ] = 1 ;
ran[ fx] -- ;
}
int main ( )
{
int n, m, op, x, y;
scanf ( "%d%d" , & n, & m) ;
ini ( n) ;
while ( m-- )
{
scanf ( "%d%d%d" , & op, & x, & y) ;
if ( op == 1 )
Merge1 ( x , y) ;
else if ( op == 2 )
{
if ( Find3 ( x) != Find3 ( y) ) printf ( "N\n" ) ;
else printf ( "Y\n" ) ;
}
}
return 0 ;
}