[问题] 给出一个连通的无向图,求图的桥的数目。
[分析] 我们从图的一个顶点开始,进行深度优先遍历,于是,我们得到一棵树。对于树上的某个节点A,如果在图中存在某边e = (A,B),满足点B已经被访问过且B不是A的父亲,这就意味着,我们找到了从A到B的一个圈。圈上的点一定不是桥,于是我们标记这条圈上的点,并收缩。继续。最后,任何非根的且未被访问的点及其父亲之间的边是一座桥。
标记圈和收缩的过程如下: for (p = A; depth[p] > depth[B]; p = parent[p]) mark[p] = 1; B' = p; for (p = A; p != B'; p = q) { q = parent[p]; parent[p] = B'; }
算法的复杂度为O(V + E log E)。