并查集 洛谷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;
    }
}
posted @ 2024-06-29 17:41  若把你比作歌  阅读(24)  评论(0)    收藏  举报