E - Reachable Set Editorial
by
KumaTachiRen
実装について
Union Find を活用すれば,公式解説よりさらに簡潔に実装できます.
公式解説での判定問題・最小化問題は以下のように解けます.
- 判定問題: \(\max(u,v)\leq k\) である辺 \((u,v)\) のみからなる部分グラフ上で頂点 \(1\) を含む連結成分の大きさが \(k\) であるか.
- 最小化問題: 求める値は \((\min(u,v)\leq k\) である辺 \((u,v)\) のみからなる部分グラフ上で頂点 \(1\) を含む連結成分の大きさ\()-k\).
ある頂点を含む連結成分の大きさは ACL の dsu
では size
によって取得できます.(参考:ACL Document - DSU)
実装例(C++)
#include <bits/stdc++.h>
using namespace std;
#include <atcoder/dsu>
int main() {
int n, m;
cin >> n >> m;
vector<vector<int>> edges(n);
while (m--) {
int u, v;
cin >> u >> v;
u--, v--;
edges[u].push_back(v);
edges[v].push_back(u);
}
atcoder::dsu uf_small(n), uf_large(n);
for (int i = 0; i < n; i++) {
for (auto j : edges[i]) (j < i ? uf_small : uf_large).merge(i, j);
cout << (uf_small.size(i) == i + 1 ? uf_large.size(i) - (i + 1) : -1) << "\n";
}
}
posted:
last update: