【总结】DFS树

### DFS 树

DFS 树

移除边来构建二分图

问题 3:考虑一个无向图,找到所有的边,将这些边移除后,图将变为二分图。

这题是 codeforces 19E - Fairy。官方没有发布题解,但一个 非官方题解提到了用复杂的数据结构动态树解答。利用 DFS 树,我们可以不使用高级的数据结构来解答这题。

在最初的问题中,图需要被连接。然而,明显可得:

  • 如果图没有非二分部件,那么移除任意一条边都可以
  • 如果图的多个非二分部件,那么不可能将其边为二分图

那么,唯一需要有意思的情况就是当、只有一个非二分部件的情况。显然移除的边显然来自该部件,所以我们可以假设只有一个部件。从现在开始,我们假设我们有一个非二分的连通图。

让我们建立该图的 DFS 树,我们可以将点涂成黑和白来让每个树边都连接一个黑色顶点和一个白色顶点。一些回边肯会连接同样颜色的顶点,我们称其为矛盾边

结论 7:回边 uv 满足条件当且仅当 uv 是唯一的矛盾边。

证明:如果我们移除唯一的矛盾边,图的所有边就都连接不同的颜色,那么就成为二分图;如果有其他的矛盾边或我们移除了一条非矛盾边,遗留的矛盾边将继续构成奇数环并且图无法成为二分图。

结论 8:回边 uv 满足条件当且仅当所有矛盾边都是它的回边。

证明:如果我们移除了一条树边,生成树将会分成两个部分:uv 的子树和剩余的部分。此时剩余的所有树边依旧连接着不同颜色的点。因此,唯一使二分图成立的方法使将将 uv 的子树中的所有节点翻转颜色。
移除树边 uv 满足条件当且仅当翻转颜色后消除了所有的矛盾而且不产生新的矛盾。这只在矛盾边都是连接 uv 的子树和图的剩余部分是成立。

因此,我们可以这样解决问题:
1.建立图的 DFS 树并将它涂成两色;
2.如果只存在一条矛盾的回边,将其加入答案;
3.用动态规划去计算每一条树边有多少矛盾边和多少非矛盾边跨越它;
4.如果一条树边包含了所有的矛盾回边且没有非矛盾回边跨越它,将其加入答案

上一篇:PV 和 UV 的区别


下一篇:实时统计每天pv,uv的sparkStreaming结合redis结果存入mysql供前端展示