poj 3694 network

题目大意

给一张无向连通图,然后给q个操作,每个操作都会在某两个点xy之间连边,问每一个操作之后还有几座桥。

题解

先用tarjan求边双,缩点求新图。
先让ans=割边条数
然后对于每一个操作(x,y)
如果他们在同一个边双里,答案不变。
如果不在同一个边双,那么求出他们边双的lca=LCA(block[x],block[y]);
x和y两个点分别向父亲跳,直到到lca。途径全部打上不是桥的标记。新增标记个数为delta的话,当前答案就是ans-=delta。

一个优化

在用x和y向上跳的时候,时间复杂度为O(n),我们可以利用并查集,如果在新图上一条边不再是割边,那么把这条边两边的边双放在一个集合里面,那么向上跳的时候,如果有一个集合的大小为 k ,那么原来需要O(k)的时间,现在只需要O(1)的时间直接跳到这个集合深度最小的那个边双就行了。
这里写图片描述 本质上是用并查集的路径压缩对dfs的优化。