仅代表个人观点,如有雷同,一定是他抄我的。如有错误,那一定是你rp不好
—— 我
不知道tarjan的,右转百度百科。
本篇blog只讨论tarjan缩环。
如果你不是用链式前向星存边的,那就 Gun
先去学完再来看这篇精美的blog吧~
tarjan用法
tarjan是种非常好用的图论基本工具。缩环,找割点都行。
tarjan的缺陷
tarjan原版的工具是只能够用来缩有向图的环。这就很坑了,如果我要无向图缩环应该怎么办呢?
很简单,把无向图当成有向图就好了。具体实现就是记录上一个搜索的点是什么,然后拒绝回头路【不走来时的点】就好了。
但是,问题又来了。如果有重边而且重边也当做是环怎么办??
解决方案(我瞎比吹的)
把记录上一个点改为记录上一条来的边。有什么用呢?首先,你得是链式前向星的存边方式。这链式前向星有什么特点呢?链式前向星存的全是有向边,这个工具是通过再建立一条反向边来形成无向边的。也就是说,你只需要不再通过这条反向边回去,就能够避免重边找不到环的情况。至于为什么,聪明yuchun的你一定能搞懂。
接下来就把问题从“不再回去上一个点”变成“不在走上一条边的反向边”。这就很容易了,运用网络流建边的套路——从偶数点开始建边,无向边拆出来的两条边同时建立,那么,如果第一条边的编号是i,那么反向边的编号就是i^1。搜索的时候把这个i^1传递下去就好了。
随意谢谢,全凭走心