DFS应用于“双连通分量(BCC)分解”

来由:任何一张连通的 “ 无向图 ” 都存在若干个关键点,以它们为界,可以分解出若干个BCC分量。

一个节点v是不是关键点,关键在于内部节点(解释一下,若为叶节点则肯定不是关键点,因为它仅有一条边;若是根节点,则有一条边时就不是,有两条以上边时一定是,因为此时删除根节点两棵子树一定会分裂成两棵独立的树。下面重心回到内部节点):若内部节点有回边backward指向更高的节点,则v不是关键点,否则v是关键点。(为什么?因为如果没有更高的回边,则删除掉v后子树一定会分离出去形成独立的树(也就是连通域+1)。)

算法:做dfs,检视每个节点的所有孩子,看他们能不能连接到比该节点更高的祖先(最高祖先的dtime记录在 hca中 )。这里只比较dtime即可用括号引理判断祖先高低。(小技巧:用hca(x)盗用fTime(x)的存储空间——因为求BCC用不到ftime:#define hca(x) ( fTime(x) )。)

       在DFS过程中记录每个节点的dtime和hca(回边指向的最高可达节点的dtime值,默认为指向自己(自己的dtime值))。在无路可走进行backtruck时对所到节点也进行hca更新(叶子得道,祖先升天)。此时如果父亲得到不好的消息,即自己的hca不会被更新,则可以确认自己是一个关键点,则一个BCC已经找到需要被报告出来(用pop弹出即可,除了该节点还属于另一个BCC的情况,因为如果它此时弹出了,那个BCC就失去了这个节点导致错误,所以应该用print输出这个关键点)。

                                                                                         注:图片来源于邓俊辉老师的数据结构课

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值