An edge in an undirected graph is said to be a bridge, if and only if by removing it, disconnects the graph, or make different components of the graph.
In a practical approach, if some bridges are present in a network when the connection of bridges is broken, it can break the whole network.
Input and Output
Input: The adjacency matrix of the graph. 0 1 1 1 0 1 0 1 0 0 1 1 0 0 0 1 0 0 0 1 0 0 0 1 0 Output: Bridges in given graph: Bridge 3--4 Bridge 0--3
Algorithm
bridgeFind(start, visited, disc, low, parent)
Input − The start vertex, the visited array to mark when a node is visited, the disc will hold the discovery time of the vertex, and low will hold information about subtrees. The parent will hold the parent of the current vertex.
Output − print if any bridge is found.
Begin time := 0 //the value of time will not be initialized for next function calls mark start as visited set disc[start] := time+1 and low[start] := time + 1 time := time + 1 for all vertex v in the graph G, do if there is an edge between (start, v), then if v is visited, then parent[v] := start bridgeFind(v, visited, disc, low, parent) low[start] := minimum of low[start] and low[v] if low[v] > disc[start], then display bridges from start to v else if v is not the parent of start, then low[start] := minimum of low[start] and disc[v] done End
Example
#include<iostream> #define NODE 5 using namespace std; int graph[NODE][NODE] = { {0, 1, 1, 1, 0}, {1, 0, 1, 0, 0}, {1, 1, 0, 0, 0}, {1, 0, 0, 0, 1}, {0, 0, 0, 1, 0} }; int min(int a, int b) { return (a<b)?a:b; } void bridgeFind(int start, bool visited[], int disc[], int low[], int parent[]) { static int time = 0; visited[start] = true; //make the first vertex is visited disc[start] = low[start] = ++time; //initialize discovery time and the low time for(int v = 0; v<NODE; v++) { if(graph[start][v]) { //for all vertex v, which is connected with start if(!visited[v]) { parent[v] = start; //make start node as parent bridgeFind(v, visited, disc, low, parent); low[start] = min(low[start], low[v]); //when subtree from v is connected to one of parent of start node if(low[v] > disc[start]) cout << "Bridge " << start << "--"<<v<<endl; } else if(v != parent[start]) //update low of start for previous call low[start] = min(low[start], disc[v]); } } } bool bridges() { bool *vis = new bool[NODE]; int *disc = new int[NODE]; int *low = new int[NODE]; int *parent = new int[NODE]; for(int i = 0; i<NODE; i++) { vis[i] = false; //no node is visited parent[i] = -1; //initially there is no parent for any node } for(int i = 0; i<NODE; i++) if(!vis[i]) //if any node is unvisited, the graph is not connected bridgeFind(i, vis, disc, low, parent); } int main() { cout << "Bridges in given graph:"<<endl; bridges(); }
Output
Bridges in given graph: Bridge 3--4 Bridge 0--3