题解:CF1325F Ehab's Last Theorem
Priestess_SLG · · 题解
APIO 讲课例题。
独立集比较难找,考虑先处理更好找的简单环。注意到求出图的任意一棵生成树后,若图中存在一个
考虑若一张图不能通过上述方式找出简单环满足怎样的性质。注意到此时对图上任意一个点
时间复杂度
pair<int, int> e[N];
vector<int> adj[N], adj2[N];
int a[N], dep[N], up[N], vis[N], to[N];
inline void dfs(int u, int fa) {
dep[u] = dep[fa] + 1, up[u] = fa;
if (fa) adj2[u].emplace_back(fa), adj2[fa].emplace_back(u);
for (int &v : adj[u]) if (!dep[v]) dfs(v, u);
}
inline void sol() {
int n, m; cin >> n >> m;
for (int i = 1; i <= m; ++i) {
int a, b; cin >> a >> b;
e[i] = {a, b};
adj[a].emplace_back(b);
adj[b].emplace_back(a);
} dfs(1, 0);
int B = (int)ceil(sqrt(n));
set<pair<int, int>> used_edges;
for (int i = 1; i <= n; ++i)
for (int &j : adj2[i]) used_edges.emplace(i, j);
for (int i = 1; i <= m; ++i) {
auto [u, v] = e[i];
if (!used_edges.count({u, v}) && abs(dep[u] - dep[v]) >= B - 1) {
cout << 2 << '\n';
if (dep[u] > dep[v]) swap(u, v);
vector<int> ring;
while (v != u) {
ring.emplace_back(v);
v = up[v];
} ring.emplace_back(u);
cout << ring.size() << '\n';
for (int &i : ring) cout << i << ' ';
cout << '\n';
return;
}
} cout << 1 << '\n';
vector<int> independent;
int pos = 1;
iota(to + 1, to + n + 1, 1);
sort(to + 1, to + n + 1, [&](auto &l, auto &r) { return dep[l] > dep[r]; });
for (int i = 0; i < B; ++i) {
while (pos <= n && vis[to[pos]]) ++pos;
assert(pos <= n), vis[to[pos]] = 1, independent.emplace_back(to[pos]);
for (int &j : adj[to[pos]]) vis[j] = 1; vis[to[pos]] = 1;
} for (int &v : independent) cout << v << ' ';
cout << '\n';
}