This documentation is automatically generated by online-judge-tools/verification-helper
集合を扱うデータ構造
unite(x, y)
: 集合 x
と y
を併合する。未併合か否かを bool
値で返すfind(x)
: 要素 x
が属する集合を求めるsize(x)
: 要素 x
が属する集合の要素数を求めるsame(x, y)
: 要素 x,y
が同じ集合に属するか判定する#pragma once
#include <bits/stdc++.h>
using namespace std;
struct UnionFind {
vector<int> data;
UnionFind() = default;
explicit UnionFind(size_t sz) : data(sz, -1) {}
bool unite(int x, int y) {
x = find(x);
y = find(y);
if(x == y) return false;
if(data[x] > data[y]) swap(x, y);
data[x] += data[y];
data[y] = x;
return true;
}
int find(int x) { return data[x] < 0 ? x : data[x] = find(data[x]); }
int size(int x) { return -data[x]; }
bool same(int x, int y) { return find(x) == find(y); }
};
/*
* @brief Union-Find
* @docs docs/union-find.md
*/
#line 2 "data-structure/union-find.cpp"
#include <bits/stdc++.h>
using namespace std;
struct UnionFind {
vector<int> data;
UnionFind() = default;
explicit UnionFind(size_t sz) : data(sz, -1) {}
bool unite(int x, int y) {
x = find(x);
y = find(y);
if(x == y) return false;
if(data[x] > data[y]) swap(x, y);
data[x] += data[y];
data[y] = x;
return true;
}
int find(int x) { return data[x] < 0 ? x : data[x] = find(data[x]); }
int size(int x) { return -data[x]; }
bool same(int x, int y) { return find(x) == find(y); }
};
/*
* @brief Union-Find
* @docs docs/union-find.md
*/