【总结】DFS树
### DFS 树
移除边来构建二分图
问题 3:考虑一个无向图,找到所有的边,将这些边移除后,图将变为二分图。
这题是 codeforces 19E - Fairy。官方没有发布题解,但一个 非官方题解提到了用复杂的数据结构动态树解答。利用 DFS 树,我们可以不使用高级的数据结构来解答这题。
在最初的问题中,图需要被连接。然而,明显可得:
- 如果图没有非二分部件,那么移除任意一条边都可以
- 如果图的多个非二分部件,那么不可能将其边为二分图
那么,唯一需要有意思的情况就是当、只有一个非二分部件的情况。显然移除的边显然来自该部件,所以我们可以假设只有一个部件。从现在开始,我们假设我们有一个非二分的连通图。
让我们建立该图的 DFS 树,我们可以将点涂成黑和白来让每个树边都连接一个黑色顶点和一个白色顶点。一些回边肯会连接同样颜色的顶点,我们称其为矛盾边。
结论 7:回边 uv 满足条件当且仅当 uv 是唯一的矛盾边。
证明:如果我们移除唯一的矛盾边,图的所有边就都连接不同的颜色,那么就成为二分图;如果有其他的矛盾边或我们移除了一条非矛盾边,遗留的矛盾边将继续构成奇数环并且图无法成为二分图。
结论 8:回边 uv 满足条件当且仅当所有矛盾边都是它的回边。
证明:如果我们移除了一条树边,生成树将会分成两个部分:uv 的子树和剩余的部分。此时剩余的所有树边依旧连接着不同颜色的点。因此,唯一使二分图成立的方法使将将 uv 的子树中的所有节点翻转颜色。
移除树边 uv 满足条件当且仅当翻转颜色后消除了所有的矛盾而且不产生新的矛盾。这只在矛盾边都是连接 uv 的子树和图的剩余部分是成立。
因此,我们可以这样解决问题:
1.建立图的 DFS 树并将它涂成两色;
2.如果只存在一条矛盾的回边,将其加入答案;
3.用动态规划去计算每一条树边有多少矛盾边和多少非矛盾边跨越它;
4.如果一条树边包含了所有的矛盾回边且没有非矛盾回边跨越它,将其加入答案
__EOF__

本文链接:https://www.cnblogs.com/cqbzly/p/17530354.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」