CF858F Wizard's Tour

传送门

麻了一道大水题因为我忘了图不一定联通调了 40 分钟...


思路

一棵树的情况很好解决,按照拓扑序(也就是从叶子到根)进行匹配,且每次都最后匹配与父亲的连边(若边数为奇数则不匹配)

变成无向图后,考虑先走出一棵 DFS 树,然后和树的做法一模一样

其实这样的做法就是为了时刻保持原本的联通性


代码

#include<iostream> #include<fstream> #include<algorithm> #include<cmath> #include<cstdlib> #include<cstring> #include<queue> #include<map> #include<set> #include<bitset> #define LL long long #define FOR(i, x, y) for(int i = (x); i <= (y); i++) #define ROF(i, x, y) for(int i = (x); i >= (y); i--) #define PFOR(i, x) for(int i = he[x]; i; i = r[i].nxt) inline int reads() { int sign = 1, re = 0; char c = getchar(); while(c < '0' || c > '9'){if(c == '-') sign = -1; c = getchar();} while('0' <= c && c <= '9'){re = re * 10 + (c - '0'); c = getchar();} return sign * re; } int n, m; struct Node { int to, nxt; }r[400005]; int he[200005]; inline void Edge_add(int u, int v) { static int cnt = 1; r[++cnt] = (Node){v, he[u]}; he[u] = cnt; } int ans, p1[100005], p2[100005], p3[100005]; std::bitset<200005> vis, rvis, used; int fa[200005]; void dfs(int now) { vis[now] = 1; PFOR(i, now) { if(rvis[i >> 1]) continue; int to = r[i].to; if(vis[to]) continue; rvis[i >> 1] = 1; fa[to] = i, dfs(to); } int line = 0; PFOR(i, now) { if(used[i >> 1]) continue; if((i ^ 1) == fa[now]) continue; if(!line) line = i; else { p2[++ans] = now, p1[ans] = r[line].to, p3[ans] = r[i].to, used[line >> 1] = used[i >> 1] = 1; line = 0; } } if(line && fa[now]) { p2[++ans] = now, p1[ans] = r[line].to, p3[ans] = r[fa[now] ^ 1].to, used[line >> 1] = used[fa[now] >> 1] = 1; line = 0; } } signed main() { #ifndef ONLINE_JUDGE freopen("test.in", "r", stdin); freopen("test.out", "w", stdout); #endif n = reads(), m = reads(); FOR(i, 1, m) { int u = reads(), v = reads(); Edge_add(u, v), Edge_add(v, u); } FOR(i, 1, n) if(!vis[i]) dfs(i); printf("%d\n", ans); FOR(i, 1, ans) printf("%d %d %d\n", p1[i], p2[i], p3[i]); return 0; }

__EOF__

本文作者zuytong
本文链接https://www.cnblogs.com/zuytong/p/16665665.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   zuytong  阅读(35)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示