You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

46 lines
1.2 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include <bits/stdc++.h>
using namespace std;
const int N = 5010;
int n; //n个人
int m; //m个亲戚
int p; //询问p对亲戚关系
int x, y; //输入两个人之间的关系
int fa[N]; //并查集数组
//要深入理解这个递归并压缩的过程
int find(int x) {
if (fa[x] != x)//如果x不是族长,递归找父亲,副产品就是找回的结果更新掉自己的家族信息。
fa[x] = find(fa[x]);//非常经典的更新,路径压缩大法!
//返回族长是谁
return fa[x];
}
//加入家族集合中
void join(int c1, int c2) {
int f1 = find(c1), f2 = find(c2);
if (f1 != f2)fa[f1] = f2;//各自找家长如果家长不一样就把C1的族长认C2的族长为爸爸,C1的族长强烈表示不满意
}
int main() {
cin >> n >> m >> p;
//并查集初始化
for (int i = 1; i <= n; i++)fa[i] = i; //自己是自己的老大
//录入m种关系
for (int i = 1; i <= m; i++) {
cin >> x >> y;
//加入并查集
join(x, y);
}
//处理p次询问
while (p--) {
cin >> x >> y;
if (find(x) == find(y)) cout << "Yes" << endl;
else cout << "No" << endl;
}
return 0;
}