An undirected graph is called Biconnected if there are two vertex-disjoint paths between any two vertices. In a Biconnected Graph, there is a simple cycle through any two vertices.
By convention, two nodes connected by an edge form a biconnected graph, but this does not verify the above properties. For a graph with more than two vertices, the above properties must be there for it to be Biconnected.
Following are some examples.
How to find if a given graph is Biconnected or not?
A connected graph is Biconnected if it is connected and doesn’t have any Articulation Point. We mainly need to check two things in a graph.
1) The graph is connected.
2) There is not articulation point in graph.
[ad type=”banner”]
We start from any vertex and do DFS traversal. In DFS traversal, we check if there is any articulation point. If we don’t find any articulation point, then the graph is Biconnected. Finally, we need to check whether all vertices were reachable in DFS or not. If all vertices were not reachable, then the graph is not even connected.
from collections import defaultdict
class Graph:
def __init__(self,vertices):
self.V= vertices
self.graph = defaultdict(list)
self.Time = 0
def addEdge(self,u,v):
self.graph[u].append(v)
self.graph[v].append(u)
'''A recursive function that returns true if there is an articulation
point in given graph, otherwise returns false.
This function is almost same as isAPUtil()
u --> The vertex to be visited next
visited[] --> keeps tract of visited vertices
disc[] --> Stores discovery times of visited vertices
parent[] --> Stores parent vertices in DFS tree'''
def isBCUtil(self,u, visited, parent, low, disc):
children =0
visited[u]= True
disc[u] = self.Time
low[u] = self.Time
self.Time += 1
for v in self.graph[u]:
if visited[v] == False :
parent[v] = u
children += 1
if self.isBCUtil(v, visited, parent, low, disc):
return True
low[u] = min(low[u], low[v])
if parent[u] == -1 and children > 1:
return True
if parent[u] != -1 and low[v] >= disc[u]:
return True
elif v != parent[u]:
low[u] = min(low[u], disc[v])
return False
def isBC(self):
visited = [False] * (self.V)
disc = [float("Inf")] * (self.V)
low = [float("Inf")] * (self.V)
parent = [-1] * (self.V)
if self.isBCUtil(0, visited, parent, low, disc):
return False
'''Now check whether the given graph is connected or not.
An undirected graph is connected if all vertices are
reachable from any starting point (we have taken 0 as
starting point)'''
if any(i == False for i in visited):
return False
return True
g1 = Graph(2)
g1.addEdge(0, 1)
print "Yes" if g1.isBC() else "No"
g2 = Graph(5)
g2.addEdge(1, 0)
g2.addEdge(0, 2)
g2.addEdge(2, 1)
g2.addEdge(0, 3)
g2.addEdge(3, 4)
g2.addEdge(2, 4)
print "Yes" if g2.isBC() else "No"
g3 = Graph(3)
g3.addEdge(0, 1)
g3.addEdge(1, 2)
print "Yes" if g3.isBC() else "No"
g4 = Graph (5)
g4.addEdge(1, 0)
g4.addEdge(0, 2)
g4.addEdge(2, 1)
g4.addEdge(0, 3)
g4.addEdge(3, 4)
print "Yes" if g4.isBC() else "No"
g5 = Graph(3)
g5.addEdge(0, 1)
g5.addEdge(1, 2)
g5.addEdge(2, 0)
print "Yes" if g5.isBC() else "No"
Output:
Yes
Yes
No
No
Yes
[ad type=”banner”]