题解:P3367 【模板】并查集

· · 题解

并查集

在正式开始写程序之前,我们先来了解一下并查集。

并查集是一种精巧而实用的数据结构,它主要用于处理一些不相交集合的合并问题。经典的应用有连通图、最小生成树 Kruskal 算法、最近公共祖先(LCA)等。并查集在算法竞赛中极为常见。

初步了解

并查集的操作

解题思路

那么当我们已经基本了解并查集以后,完成这道题就非常简单了。

在这道题,题目要求我们实现两个操作:

根据上面的介绍,合并操作就是一个:

dist[find(p2)] = find(p3);

查询操作就是一个:

if (find(p2) == find(p3)) cout << "Y\n";
else cout << "N\n";

别忘了 find 函数:

int find(int k) {
    if (dist[k] == k) return k;
    return dist[k] = find(dist[k]);
}

参考代码

#include<bits/stdc++.h>
#define int int
#define fast_running ios::sync_with_stdio(false),std::cin.tie(0),std::cout.tie(0);
using namespace std;
int n, m, s, ans;
int dist[200005];
int find(int k) {  // 查找操作,带路径压缩
    if (dist[k] == k) return k;
    return dist[k] = find(dist[k]);
}
signed main() {
    fast_running;
    cin >> n >> m;
    for (int i = 1; i <= n; i++) dist[i] = i; // 初始化并查集
    for (int i = 1; i <= m; i++) { // 处理每个操作
        int p1, p2, p3;
        cin >> p1 >> p2 >> p3;
        if (p1 == 1) { // 合并操作
            dist[find(p2)] = find(p3);
        } else { // 查询操作
            if (find(p2) == find(p3)) cout << "Y\n";
            else cout << "N\n";
        }
    }
    return 0;
}

~ 完结撒花 ~