Check if Hamiltonian Cycle exists in a graph using Python
In this blog, we will find whether a graph contains a Hamiltonian cycle or not in Python
What does one mean by a Hamiltonian path/cycle?
A hamiltonian path refers to a path that passes all the vertices of a graph exactly once.
Ex:
A hamiltonian cycle refers to a cycle that passes all the vertices of a graph exactly once.
Ex:
Algorithm:
To find the hamiltonian cycle we will be using backtracking along with DFS to traverse all the different types of hamiltonian paths possible.
- We first create a path list which will store the current path that we have traveled
- Then, we start a DFS from the root and keep appending the different root that we get as we traverse through the graph.
- Parameters we use to see if a node is safe to jump in DFS are:
- If a node does not exist in our already traveled path.
- If we have found a hamiltonian cycle, then we don’t need to traverse any further.
#------------------------------------------
'''
Defining our safe vertex as
something which is not in our
path
'''
def safeVertex(node):
if(node in path):
return False
return True
#-------------------------------------------
#-------------------------------------------
'''
Defining our DFS and
Backtracking Logic
'''
def cycleDetection(E,n,root):
path.append(root)
#Seeing all the neigbours of the current root
for i in E[root]:
#Checking if our vertex satisfies the safe Vertex
if(safeVertex(i)):
#Checking if a cycle has already been detected or not in the
#---------------------previous recursion--------------------
if(cycleDetection(E,n,i)):
return True
#Checking if our current path has all the vertices
if(len(path) == n):
#If there is an edge from last vertex to the first vertex in our path
#-------------then we have an hamiltonian cycle---------------------
if(path[0] in E[path[len(path)-1]]):
return True
else:
return False
#once we are done we remove that particle from the iteration
path.pop()
#-------------------------------------------
#-------------------------------------------
'''
Printing True or False
based on our output from Cycle Detection
'''
def HamiltonianCycle(E,n,root):
if(cycleDetection(E,n,root)):
print("True")
else:
print("False")
#-------------------------------------------
path = []
N_Vertices = int(input())
matrix = list()
for i in range(N_Vertices):
matrix.append([])
N_Edges = int(input())
for j in range(N_Edges):
edge_vertices = input().split()
u = int(edge_vertices[0])
v = int(edge_vertices[1])
matrix[u-1].append(v-1)
matrix[v-1].append(u-1)
HamiltonianCycle(matrix,N_Vertices,0)
#This path is actually a Hamiltonian cycle.
print(path)
Input: (this is essentially the graph which was given in the hamiltonian cycle example with 7 vertices) 7 10 1 2 1 3 1 6 6 7 7 5 2 3 3 4 3 5 4 5 5 6
Output: True [0, 1, 2, 3, 4, 6, 5]


Leave a Reply