1 介绍
本专题用来记录并查集相关的题目。
并查集模板:
//初始化
for (int i = 1; i <= n; ++i) {
//n为结点数目
p[i] = i;
}
//查找
find(int x) {
if (p[x] != x) p[x] = find(p[x]);
return p[x];
}
//合并
int pa = find(a);
int pb = find(b);
if (pa != pb) {
p[pa] = pb;
}
2 训练
题目1:1250格子游戏
C++代码如下,
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 210;
int n, m;
int p[N * N];
int find(int x) {
if (p[x] != x) p[x] = find(p[x]);
return p[x];
}
int main() {
cin >> n >> m;
for (int i = 0; i < n * n; ++i) p[i] = i;
for (int i = 1; i <= m; ++i) {
int x, y;
char op;
cin >> x >> y >> op;
int a, b;
if (op == 'D') {
a = (x - 1) * n + y - 1;
b = x * n + y - 1;
} else {
a = (x - 1) * n + y - 1;
b = (x - 1) * n + y;
}
int pa = find(a);
int pb = find(b);
if (pa == pb) {
cout << i << endl;
return 0;
} else {
p[pa] = pb;
}
}
cout << "draw" << endl;
return 0;
}
题目2:1252搭配购买
C++代码如下,
#include