sotanishy's code snippets for competitive programming
#include "data-structure/unionfind/weighted_union_find.hpp"
重み付き union find は,union find の操作に加えて,同じ集合に属する他の要素に対する要素の相対的な重みを管理する.
空間計算量: $O(n)$
WeightedUnionFind(int n)
n
の重み付き union find を構築する.int find(int x)
T weight(int x)
void unite(int x, int y, T w)
bool same(int x, int y)
T diff(int x, int y)
int size(int x)
#pragma once
#include <algorithm>
#include <vector>
template <typename T>
class WeightedUnionFind {
public:
WeightedUnionFind() = default;
explicit WeightedUnionFind(int n) : data(n, -1), ws(n) {}
int find(int x) {
if (data[x] < 0) return x;
int r = find(data[x]);
ws[x] += ws[data[x]];
return data[x] = r;
}
T weight(int x) {
find(x);
return ws[x];
}
bool unite(int x, int y, T w) {
w += weight(x);
w -= weight(y);
x = find(x);
y = find(y);
if (x == y) return false;
if (data[x] > data[y]) {
std::swap(x, y);
w = -w;
}
data[x] += data[y];
data[y] = x;
ws[y] = w;
return true;
}
bool same(int x, int y) { return find(x) == find(y); }
T diff(int x, int y) { return weight(y) - weight(x); }
int size(int x) { return -data[find(x)]; }
private:
std::vector<int> data;
std::vector<T> ws;
};
#line 2 "data-structure/unionfind/weighted_union_find.hpp"
#include <algorithm>
#include <vector>
template <typename T>
class WeightedUnionFind {
public:
WeightedUnionFind() = default;
explicit WeightedUnionFind(int n) : data(n, -1), ws(n) {}
int find(int x) {
if (data[x] < 0) return x;
int r = find(data[x]);
ws[x] += ws[data[x]];
return data[x] = r;
}
T weight(int x) {
find(x);
return ws[x];
}
bool unite(int x, int y, T w) {
w += weight(x);
w -= weight(y);
x = find(x);
y = find(y);
if (x == y) return false;
if (data[x] > data[y]) {
std::swap(x, y);
w = -w;
}
data[x] += data[y];
data[y] = x;
ws[y] = w;
return true;
}
bool same(int x, int y) { return find(x) == find(y); }
T diff(int x, int y) { return weight(y) - weight(x); }
int size(int x) { return -data[find(x)]; }
private:
std::vector<int> data;
std::vector<T> ws;
};