1
+ '''
2
+ Hamiltonian Path: a Hamiltonian path (or traceable path) is a path
3
+ in an undirected or directed graph that visits each vertex exactly
4
+ once. A Hamiltonian cycle (or Hamiltonian circuit) is a Hamiltonian
5
+ path that is a cycle.
6
+ Aim: To determine the existance of a Hamiltonian Cycle in the provided
7
+ undirected graph and return the path if such path exist.
8
+ The nodes are numbered from 1 to N.
9
+
10
+ '''
11
+
12
+ from collections import defaultdict
13
+
14
+
15
+ def Move_next_node (n , graph , pos , ans ):
16
+ # Base Case: If all the node is visited:
17
+ if pos == n :
18
+
19
+ # Check wether the last node and the first node are
20
+ # connected in order to form a Cycle
21
+ if ans [0 ] in graph [ans [- 1 ]]:
22
+ return ans + [ans [0 ]]
23
+
24
+ return False
25
+
26
+ current = ans [- 1 ]
27
+
28
+ # Check for each of the adjoining vertices
29
+ for i in graph [current ]:
30
+
31
+ # Check wether the node is already visited or not
32
+ if i not in ans :
33
+ ans += [i ]
34
+ temp = Move_next_node (n , graph , pos + 1 , ans )
35
+ if temp :
36
+ return temp
37
+
38
+ ans .pop ()
39
+
40
+ return False
41
+
42
+
43
+ def Hamiltonial_Cycle (n , graph ):
44
+ # To keep a track of already visited node and the answer
45
+ # We will start exploring the graph from Vertex 1
46
+ answer = [1 ]
47
+
48
+ # Start Exploring adjoining node/vertex
49
+ return Move_next_node (n , graph , 1 , answer )
50
+
51
+
52
+ # ------------------------DRIVER CODE ------------------------
53
+ if __name__ == "__main__" :
54
+ n , m = map (int , input ("Enter the number of vertex and edges: " ).split ())
55
+ print ("Enter the edges: " )
56
+ graph = defaultdict (list )
57
+ for i in range (m ):
58
+ a , b = map (int , input ().split ())
59
+ graph [a ] += [b ]
60
+ graph [b ] += [a ]
61
+ ans = Hamiltonial_Cycle (n , graph )
62
+ if not ans :
63
+ print ("Hamiltonian Cycle is not possible in the Given graph" )
64
+ else :
65
+ print ("Hamiltonian Cycle is possible in the graph" )
66
+ print ("The path is : " , * ans )
67
+
68
+ '''
69
+
70
+ Sample Working:
71
+
72
+ 5----1------2
73
+ /\ \ /
74
+ / \ \ /
75
+ / \ \/
76
+ 3------6-----4
77
+ Enter the number of vertex and edges: 6 8
78
+ Enter the edges
79
+ 5 1
80
+ 1 2
81
+ 1 4
82
+ 5 6
83
+ 6 4
84
+ 4 2
85
+ 3 6
86
+ 5 3
87
+ Hamiltonian Cycle is possible in the graph
88
+ The path is : 1 5 3 6 4 2 1
89
+ 5----1------2
90
+ \ \
91
+ \ \
92
+ \ \
93
+ 3------6-----4
94
+ Enter the number of vertex and edges: 6 6
95
+ Enter the edges:
96
+ 5 1
97
+ 3 6
98
+ 6 4
99
+ 1 2
100
+ 5 6
101
+ 1 4
102
+ Hamiltonian Cycle is not possible in the Given graph
103
+
104
+ COMPLEXITY:
105
+
106
+ Time Complexity -> O(2^N)
107
+ Space Complexity -> O(N)
108
+
109
+ '''
0 commit comments