分别求出 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树分成了三部分:
其中黑色的圈表示树上的连通块,黑色的虚线表示割掉的树边,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