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 k <script id="MathJax-Element-35" type="math/tex">k</script>,那么原来需要O(k)的时间,现在只需要O(1)的时间直接跳到这个集合深度最小的那个边双就行了。
这里写图片描述
本质上是用并查集的路径压缩对dfs的优化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值