# **Bridge Detection Algorithm**
In an undirected connected graph, a bridge is an edge that if cut, the graph will no longer be connected. For example, every edge in a (undirected) tree is a bridge edge. As another example, a simple cycle graph does not have any edge.
Devise an efficient algorithm to identify all bridge edges in an undirected connected graph.
# **Algorithm**
The following algorithm uses the function bridge_detection(G) to do a depth-first search traversal on the graph while keeping two arrays. The first array keeps track of the discovery time of the ```u``` vertex, while the second array has the lowest discovery time reachable from ```u```, including edges.
```
fun bridge_detection(G){
var time = 0;
for(e in vertex G){
if(!visited[u]){
FDS(u, visited, disc, low, parent, time);
}
}
}
fun DFS(u){
visited[u] = true;
disc[u] = low[u] = time++;
for(v in adj[u]){
if(!visited[v]){
parent[v] = u;
DFS(v);
low[u] = min(low[u], low[v]);
if(low[v] > disc[u]){
print(u, v);
}
}
else if(v != parent[u]){
low[u] = min(low[u], disc[v]);
}
}
}
```
# **Correctness Proof**
**Goal:** the function bridge_detection(G) will correctly find all bridge edges in an undirected connected graph
**Base Cases:**
* vertex ```u``` has no parent: if there is no back edge from v or its descendants to u for any single edge (u,v) --> low[v] > disc[u] must be true, marking (u,v) correctly as a bridge
**Inductive Hypothesis:**
Assume that for all nodes discovered before ```u```, the algorithm will correctly identify all bridge edges in an undirected connected graph by computing the discovery time of x.
* for every neighbor v --> if v is not visited, recurse DFS(v), update low[u] to equal min(low[u], low[v]). If low[v] > disc[u], there is no back edge from v or the descendants to u, making (u, v) a bridge
* if v IS visited and is not the parent of u --> update low[u] to equal min(low[u], disc[v]) to account for back edges
Thus, by induction, the algorithm correctly computes and finds all bridge edges in an undirected connected graph.
# **Time Complexity**
Each vertex and edge is visited exactly once in DFS
* n --> # of vertices
* m --> # of edges
Thus,
* T(n) = O(n + m)