本文参考资料: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)