并查集
基本思路,给每个人名编号(存到一个大的数组中,貌似也可用数据结构实现,稍后补),然后维护并查集
基本思路,给每个人名编号(存到一个大的数组中,貌似也可用数据结构实现,稍后补),然后维护并查集
代码如下:
#include <bits/stdc++.h>
#define maxn 200010
using namespace std;
int p[maxn];
int findpa( int x){
return p[x] == x ? x : p[x] = findpa( p[x]);
}
void unionpa( int x, int y){
int fx = findpa( x), fy = findpa( y);
if ( fx != fy) p[fy] = fx;
}
char a[20], b[20], str[maxn][20];
int main()
{
int n, t, c = 0;
scanf( "%d", &n);
for ( int i = 0; i <= n * 2; i++){
p[i] = i;
}
while ( n--){
scanf( "%d%s%s", &t, a, b);
int x = -1, y = -1;
for ( int i = 0; i < c; i++){
if ( !strcmp( a, str[i]))
x = i;
if ( !strcmp( b, str[i]))
y = i;
}
if ( x == -1){
x = c;
strcpy( str[c], a);
c++;
}
if ( y == -1){
y = c;
strcpy( str[c], b);
c++;
}
if ( t){
if ( findpa( x) == findpa( y))
printf( "yes\n");
else
printf( "no\n");
}
else
unionpa( x, y);
}
return 0;
}