#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int p[N];
int find(int x) {
if (x == p[x]) //如果x是祖先,则返回
return x;
else
return find(p[x]); //如果x不是祖先,则x的爸爸 问 x的爷爷
}
//路径压缩的find函数
int find2(int x) {
if (x != p[x]) // x不是自身的父亲,即x不是该集合的代表
p[x] = find(p[x]); // 查找x的祖先直到找到代表,于是顺手路径压缩
return p[x];
}
int main() {
int n, m;
cin >> n >> m;
// 记录某个人的爸爸是谁,特别规定,祖先的爸爸是他自己
for (int i = 1; i <= n; i++) p[i] = i;
while (m--) {
string op;
cin >> op;
int a, b;
cin >> a >> b;
if (op == "M") p[find(a)] = find(b);
else if (op == "Q") {
if (find(a) == find(b)) puts("Yes");
else puts("No");
}
}
}
详细的离谱
针布戳
你的答案代码里好像没有用到路径压缩函数find2
腾杨天下也太搞了吧
# 我觉得没问题