C++ :: Articulation Bridge Detection Algorithm
PSEUDOCODE
ARTICULATION-BRIDGE-DFS-VISIT(G,u) time = time + 1 u.d = u.low = time u.color = GRAY for each v ∈ G.Adj[u] if v.color == WHITE v.π = u DFS-VISIT(G,v) if u.d == 1 if G.Adj[u].size >= 2 AND v.low > u.d bridgeCounter = bridgeCounter + 1 bridge.push(edge(u,v)) else if v.low > u.d bridgeCounter = bridgeCounter + 1 bridge.push(edge(u,v)) u.low = min(u.low, v.low) else if u.π != v u.low = min(u.low, v.d) u.color = BLACK time = time + 1 u.f = time
C++ Code
#include <cstdio> #include <algorithm> #include <iostream> #include <vector> #include <limits> #define MAX 101 using namespace std; enum colors {BLACK, WHITE, GRAY}; int color[MAX], d[MAX], p[MAX], f[MAX], low[MAX], t, vertex, edge, bridgeCounter; int NIL = numeric_limits<int>::min(); bool backEdge[MAX][MAX]; typedef pair<int,int> edges; vector<edges> bridge; vector<edges>::iterator it; void ARTICULATION_BRIDGE(vector<int>[]); void DFS(vector<int>[]); void DFS_VISIT(vector<int>[],int); int main(void) { //freopen("articbridge.txt", "r", stdin); vector<int> adjList[MAX]; int u, v; cin >> vertex >> edge; for(int e=1; e<=edge; e++) { cin >> u >> v; adjList[u].push_back(v); adjList[v].push_back(u); } ARTICULATION_BRIDGE(adjList); cout << bridgeCounter << " Ariculation Bridges." << endl; for(it=bridge.begin(); it != bridge.end(); ++it) { cout << it->first << " - " << it->second << endl; } return 0; } void ARTICULATION_BRIDGE(vector<int> G[]) { DFS(G); sort(bridge.begin(), bridge.end()); } void DFS(vector<int> G[]) { for(int u=0; u<=vertex; u++) { color[u] = WHITE; p[u] = NIL; } t = 0, bridgeCounter = 0; for(int u=1; u<=vertex; u++) { if(color[u] == WHITE) { DFS_VISIT(G,u); } } } void DFS_VISIT(vector<int> G[], int u) { t = t + 1; d[u] = low[u] = t; color[u] = GRAY; for(int i=0; i<G[u].size(); i++) { int v = G[u][i]; if(color[v] == WHITE) { p[v] = u; DFS_VISIT(G,v); if(d[u] == 1) { if(G[u].size() >= 2 && low[v] > d[u]) { // special case for root // root is an artic. point if there are two or more children bridgeCounter++; bridge.push_back(edges(u,v)); } } else if(low[v] > d[u]) { bridgeCounter++; bridge.push_back(edges(u,v)); } low[u] = min(low[u],low[v]); } else if(p[u] != v) { low[u] = min(low[u],d[v]); } } color[u] = BLACK; t = t + 1; f[u] = t; }
Sample Input
23 32 1 2 1 3 1 4 2 3 2 4 3 4 3 5 5 7 5 6 5 8 5 9 5 11 6 7 8 9 9 10 11 13 11 14 12 15 12 14 12 13 15 16 15 19 16 18 16 17 16 19 17 18 18 19 19 20 19 21 21 22 21 23 22 23
Sample Output
6 Ariculation Bridges. 3 - 5 5 - 11 9 - 10 12 - 15 19 - 20 19 - 21
.:: Artic. Bridge Related UVa Problems ::.
Refference: Introduction to Algorithms - Thomas H. Cormen