并查集 洛谷P1551
洛谷P1551
并查集
并查集有合并和查询两种基本操作
初始时,每个人的族群只有自己,随后有关系的人成为一个族群,选择一个族长
每次加入新的关系时,都会找到对应的族长。
查找操作
int find(int p1) {
while (people[p1] != p1) {
p1 = find(people[p1]);
}
return p1;
}
若指向自己,说明自己为祖先,否则找到祖先并返回
合并操作
void merge(int p1, int p2) {
if (find(p1) != find(p2)) {
people[find(p1)] = find(p2);
}
}
合并时,将祖先指向合并
AC代码
#include<bits/stdc++.h>
using namespace std;
int n, m, p;
int people[5005];
int find(int p1) {
while (people[p1] != p1) {
p1 = find(people[p1]);
}
return p1;
}
void merge(int p1, int p2) {
if (find(p1) != find(p2)) {
people[find(p1)] = find(p2);
}
}
int main() {
cin >> n >> m >> p;
int x, y;
for (int i = 0; i < n; i++) people[i] = i;
for (int i = 0; i < m; i++) {
cin >> x >> y;
merge(x, y);
}
for (int i = 0; i < p; i++) {
cin >> x >> y;
if (find(x) == find(y)) cout << "Yes" << endl;
else cout << "No" << endl;
}
}

浙公网安备 33010602011771号