HDU6431 NewNippori

该博客讨论了如何在图中计算最大流为1和2的点对数量,重点在于理解边双连通分量和如何通过割边策略进行分离。博主详细介绍了如何构建DFS树,分析割树边的不同情况,以及如何通过异或操作判断覆盖情况,最后给出了O(n + m)或O(nlogn + m)复杂度的解决方案。
摘要由CSDN通过智能技术生成

分别求出 m a x f l o w ( x , y ) maxflow(x,y) maxflow(x,y)为1,2的点对的数量,就可以算出答案。

m a x f l o w ( x , y ) = 1 maxflow(x,y)=1 maxflow(x,y)=1的点对即不在同一个边双连通分量的点对。

m a x f l o w ( x , y ) = 2 maxflow(x,y)=2 maxflow(x,y)=2的点对一定在同一个边双连通分量且可以通过割掉两条边使它们不连通。

对每个边双连通分量分别考虑。首先求出一棵dfs树。考虑割掉哪些边能够把这个边双分成不连通的两个部分:

  • 割一条树边和一条非树边。我们称一条非树边覆盖了一条树边,当且仅当非树边的两个端点在树上的最短路包含了那条树边。由于这是一个边双,所以每条树边至少被一条非树边覆盖;又由于我们只能割一条非树边,而覆盖了我们割的那条树边的非树边必须全部被割掉,所以我们割的树边一定恰好只有一条非树边覆盖了它。把那条树边和覆盖它的非树边割掉,可以把dfs树上树边两侧的部分割开。

  • 割两条树边。考虑这两条树边割开之后树边将dfs树分成了三部分:
    hdu6431.png
    其中黑色的圈表示树上的连通块,黑色的虚线表示割掉的树边,1,2,3分别表示在这三个连通块之间的非树边。

    • 如果1存在,由于每条树边都至少有一条非树边覆盖了它,所以2和3至少有一条边存在,所以这时三个块仍然连通。2存在同理。
    • 如果这三种边中,只有3这种边存在,发现割了两条树边之后,A和B组成的连通块和C之间没有边。

    所以,割的两条树边一定满足:所有的非树边要么同时覆盖这两条边,要么同时不覆盖这两条边。

如何判断覆盖了两条树边的非树边集合是否相同:可以用与uoj207那道题一样的方法,给每一条非树边随机一个 [ 0 , 2 64 ) [0,2^{64}) [0,264)的权值,设每个点的权值为所有以它作为一端的非树边的权值的异或和。则当两个点的子树内所有点的权值的异或和相同的时候,我们认为这两个点到它们的父亲的那两条边被非树边覆盖的情况相同;当某个点子树内点的权值异或和为某条非树边的权值,我们就认为这个点到父亲的那条边只被那条非树边覆盖。

首先统计跨越了只被一条非树边覆盖了的树边的点对的贡献,然后把这些树边都断开。下面考虑的是断开了这些边之后的每个连通块。

对每个点 x x x,统计出满足下面条件的点的数量:存在一对树边,割开之后能够把 x x x和这个点隔开,且 x x x位于与两条树边都相邻的那个连通块里面(上图中的连通块C)。

由于我们求的是dfs树,所有的非树边都是返祖边,不存在横叉边。所以,被覆盖情况相同的两条树边也一定是祖孙关系。

考虑把 x x x夹在了中间的那些可以割掉的树边对:

观察到:

  • 对于某条树边,能够和它配对的边显然都在一条祖孙链上。
  • 不可能存在两对树边 ( u , v ) , ( x , y ) (u,v),(x,y) (u,v),(x,y),满足 d e p u < d e p x < d e p v < d e p y dep_u < dep_x < dep_v < dep_y depu<depx<depv<depy

所以,对于某个 x x x,把它夹在了中间的树边对一定满足:假设这些树边对按照在 x x x的上面的那条边的深度升序排序得到的序列是 w 1 , w 2 , ⋯ w k w_1,w_2,\cdots w_k w1,w2,w

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值