题解:CF1268E Happy Cactus
Priestess_SLG · · 题解
先考虑图是一个树的情况。此时定义
然后考虑把上述做法扩展到仙人掌上。考虑如果当前一条边
找仙人掌中所有的环是容易的,这里就不展开说了。
文字部分描述的可能不太清楚,建议参考代码实现理解。
:::success[Code]
namespace lowspeed_song {
inline void init() {
}
int n, m;
pair<int, int> e[N];
vector<pair<int, int>> adj[N];
int f[N], g[N], Min[N], fa[N], fa_[N], dep[N];
inline void gao(int u, int v, int id) {
vector<int> v1 = {id}, v2;
for (int i = u; i != v; i = fa[i]) v2.emplace_back(fa_[i]);
reverse(v2.begin(), v2.end());
for (int &i : v2) v1.emplace_back(i);
int mi = min_element(v1.begin(), v1.end()) - v1.begin();
int mx = max_element(v1.begin(), v1.end()) - v1.begin();
int ok = 1;
for (int i = mi; i != mx; ) {
if (v1[i] > v1[(i + 1) % v1.size()]) ok = 0;
i = (i + 1) % v1.size();
} for (int i = mi; i != mx; ) {
if (v1[i] > v1[(i + v1.size() - 1) % v1.size()]) ok = 0;
i = (i + v1.size() - 1) % v1.size();
} if (ok) Min[v1[mi]] = v1[mx];
}
inline void dfs(int u, int pid) {
for (auto &[v, id] : adj[u]) if (id != pid) {
if (!dep[v]) dep[v] = dep[u] + 1, fa[v] = u, fa_[v] = id, dfs(v, id);
else if (dep[u] > dep[v]) gao(u, v, id);
}
}
inline void sol([[maybe_unused]]int __testcase_id) {
cin >> n >> m;
for (int i = 1; i <= m; ++i) {
int u, v; cin >> u >> v;
e[i] = {u, v}, adj[u].emplace_back(v, i), adj[v].emplace_back(u, i);
} dep[1] = 1, dfs(1, 0);
for (int i = 1; i <= n; ++i) f[i] = 1;
for (int i = m; i; --i) {
auto &[u, v] = e[i];
int val = f[u] + f[v];
if (Min[i]) val -= g[Min[i]];
f[u] = f[v] = g[i] = val;
} for (int i = 1; i <= n; ++i) cout << f[i] - 1 << ' '; cout << '\n';
}
} // namespace lowspeed_song
:::