GraphData之 Bridge 计算

桥边检测算法
本文介绍了一种高效检测图中所有桥边的方法。通过深度优先搜索(DFS)算法,利用disc[]数组记录节点首次被访问的时间,并使用low[]数组辅助判断是否为桥边,实现了O(V+E)的时间复杂度。

 本文参考资料:http://www.geeksforgeeks.org/bridge-in-a-graph/c


如何判断某条边是否为bridge

从图中去掉该边之后,图中完全分离(属于不同部分的节点之间互不可达)的部分增多了。

如何找到网络中的所有的bridge

 直观想法:遍历所有的边,每次去掉,观察图中分离部分是否增多。时间复杂度O(E*(V+E))

 如何降低时间复杂度

“桥”,连接作用,但在这里其实是“独木桥”的意思,即从A到B的只有这一个链接途径,如果将此桥拆除,那么A和B两部分就完全分离,即拆桥之后如果从B出发,无法再回到A。

在BFStree中,如果edge(u,v)是 bridge的话(u是v的父节点),那么不存在另外一条途径,可以从v到达u或者是u的父节点。问题的关键在于如何判断两点是否可达呢?

深度遍历图,每个节点只被访问一次,我们用disc[u] 来记录节点u在深度遍历中被访问的时间。并维持一个数组low[u].

low[u] = min(disc[u], disc[w]) ,where w is an ancestor of u and there is a back edge from some descendant of u to w.用low[v] 表示是“去掉边[u,v]后v 点可达的点中最早的时间点”,对于边[u,v](先访问u)来说,如果low[v]>disc[v],那么该边就是bridge。

降低后的复杂度

该算法本质上只是做了一次DFS遍历,所以时间复杂度为O(V+E)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值