题目描述
妈妈。——By 某班班长。
干嘛?——By 某班英语课代表。
某班的同学曾经扬言说连计算机都理不清某班的亲戚关系。终于,Jay 在考试之后有空来理一理某班的某种关系了手动滑稽。但是他因为考试考不好被家长抓去学习没时间,所以叫你来帮个忙。
某级某某班的家庭共有N个人。有M个操作,操作共有2种,为1或2。每个操作都对应2个人Xi和Yi。
当操作种类为1时,表示Xi与Yi有某种关系。
当操作种类为2时,因为这是一道签到题,所以你只要输出Xi与Yi是否在同一家庭内(只需要判断在这个询问事件之前的关系),是的话输出 Y;否则话输出 N。
干嘛?——By 某班英语课代表。
某班的同学曾经扬言说连计算机都理不清某班的亲戚关系。终于,Jay 在考试之后有空来理一理某班的某种关系了手动滑稽。但是他因为考试考不好被家长抓去学习没时间,所以叫你来帮个忙。
某级某某班的家庭共有N个人。有M个操作,操作共有2种,为1或2。每个操作都对应2个人Xi和Yi。
当操作种类为1时,表示Xi与Yi有某种关系。
当操作种类为2时,因为这是一道签到题,所以你只要输出Xi与Yi是否在同一家庭内(只需要判断在这个询问事件之前的关系),是的话输出 Y;否则话输出 N。
输入
第一行包含两个整数N,M,表示共有N个人和M个关系。
接下来M行,每行包含三个整数Zi,Xi,Yi,分别表示操作种类以及两个人的编号。
接下来M行,每行包含三个整数Zi,Xi,Yi,分别表示操作种类以及两个人的编号。
输出
对于每一个Zi=2的操作,都有一行输出,每行包含一个大写字母,为 Y 或者 N。
样例输入 Copy
4 7
2 1 2
1 1 2
2 1 2
1 3 4
2 1 4
1 2 3
2 1 4
#include <iostream> using namespace std; const int N = 10010; int n, m; int f[N]; int find(int x){ if (f[x] != x) return f[x] = find(f[x]); return f[x]; } int main(){ scanf("%d%d", &n, &m); for (int i = 1; i <= n; i ++ ) f[i] = i; while (m -- ){ int a, b, t; scanf("%d%d%d", &t, &a, &b); if (t == 1){ f[find(a)] = find(b); } else { if (find(a) == find(b)) puts("Y"); else puts("N"); } } return 0; }