题意描述:
给出N个点,M条边的无向连通图,求移除两条边后使得该图不连通的方案数。
N <= 2000 , M <= 100000
解题思路:
取一个点为根进行dfs,得到一颗dfs树,标记树边,那么非树边只存在返祖边(u和v为祖先-子节点关系)
用 sum[u] 表示u节点子树中越过u的返祖边的数量(到达u不算越过u)。
用 sta[u] 表示u节点子树中越过u的返祖边的集合。
1. 很明显桥的sum[u] = 0, 记桥的数量为C,则桥的答案贡献为 C*(m-1) - C*(C-1)/2 。(选择桥,图已经不连通,另外一条边有m-1种方案,再去重选择两条桥的方案就是贡献)
2. 若有节点的sum[u] = 1,则子树只有一条返祖边越过了u,那么选择u的父亲边和这条返祖边可以贡献+1答案。
3. 若有若干个节点的返祖边状态完全相同,sta[u1] = sta[u2] = ... = sta[uk] ,则贡献k*(k-1)/2个答案,如下图所示,图中u1和u2的 sta[u] 都是{a,b},集合大小为2,答案贡献为2*(2-1)/2 = 1。(在sta[u]相等的集合中任选两个节点,删去他们的父亲边都能使得中间部分与图不连通,sta[u]可通过给每条返祖边赋一个随机值来保存状态)