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:

Check if Hamiltonian Cycle exists in a graph using Python

A hamiltonian cycle refers to a cycle that passes all the vertices of a graph exactly once.

 

Ex:

Check if Hamiltonian Cycle exists in a graph using Python

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

Your email address will not be published. Required fields are marked *