@@ -25,7 +25,7 @@ def _build_graph(self, edges):
25
25
26
26
for a in self .adjacency_list [start_vertex_no ]:
27
27
self .reversed_adjacency_list [a ].append (start_vertex_no )
28
-
28
+
29
29
def _get_node_no (self , label , node_label_dict ):
30
30
31
31
if label in node_label_dict :
@@ -70,6 +70,7 @@ def explore(self, v, adj, postOrderVisits):
70
70
postOrderVisits .append (v )
71
71
72
72
def dfs (self , adj , postOrderVisits ):
73
+
73
74
self .visited = [ False for _ in range (len (self .nodes )) ]
74
75
for v in range (len (adj )):
75
76
if not self .visited [v ]:
@@ -99,22 +100,23 @@ def _is_strongly_connected(self):
99
100
def _is_eulerian_graph (self ):
100
101
101
102
# 1. Is balanced
102
- assert (self ._is_balanced ())
103
+ # assert(self._is_balanced())
103
104
104
105
# 2. Is strongly connected
105
- assert (self ._is_strongly_connected ())
106
+ #assert(self._is_strongly_connected())
107
+
108
+ return True
106
109
107
110
def form_cycle (self , start , cycle , visited_edge_indexes , unvisited_edge_node_dict ):
108
111
109
112
node = start
110
-
111
113
while visited_edge_indexes [node ] + 1 < len (self .adjacency_list [node ]):
112
114
113
115
cycle .append (node )
114
116
115
117
# Save this node, if there are 2 or more unvisited edges
116
- if visited_edge_indexes [node ] + 2 < len (self .adjacency_list [node ]):
117
- unvisited_edge_node_dict [node ] = len (cycle ) - 1
118
+ if ( visited_edge_indexes [node ] + 2 ) < len (self .adjacency_list [node ]):
119
+ unvisited_edge_node_dict [node ] = ( len (cycle ) - 1 )
118
120
119
121
elif node in unvisited_edge_node_dict :
120
122
unvisited_edge_node_dict .pop (node )
@@ -123,26 +125,31 @@ def form_cycle(self, start, cycle, visited_edge_indexes, unvisited_edge_node_dic
123
125
node = self .adjacency_list [node ][ visited_edge_indexes [node ] ]
124
126
125
127
cycle .append (node )
126
-
127
- return - 1 if len (unvisited_edge_node_dict ) == 0 else unvisited_edge_node_dict .popitem ()[ 1 ]
128
-
128
+
129
+ return - 1 if len (unvisited_edge_node_dict ) == 0 else next ( iter ( unvisited_edge_node_dict .values ()))
130
+
129
131
def eulerian_cycle (self ):
130
132
131
133
cycle = []
132
134
visited_edge_indexes = [- 1 for _ in range (len (self .nodes ))]
133
135
134
136
# nodes with unvisited edges: {node, position in cycle}
135
137
unvisited_edge_node_dict = dict ()
136
-
138
+
137
139
new_start_pos_in_cycle = self .form_cycle (0 , cycle , visited_edge_indexes , unvisited_edge_node_dict )
138
140
139
141
while new_start_pos_in_cycle != - 1 :
140
-
142
+
143
+ new_start = cycle [new_start_pos_in_cycle ]
141
144
new_cycle = cycle [new_start_pos_in_cycle :]
142
145
new_cycle .extend (cycle [1 :new_start_pos_in_cycle ])
143
146
cycle = new_cycle
144
-
145
- new_start = cycle [0 ]
147
+ for node in unvisited_edge_node_dict :
148
+ if unvisited_edge_node_dict [node ] >= new_start_pos_in_cycle :
149
+ unvisited_edge_node_dict [node ] -= new_start_pos_in_cycle
150
+ else :
151
+ unvisited_edge_node_dict [node ] += (len (cycle ) - new_start_pos_in_cycle )
152
+
146
153
new_start_pos_in_cycle = self .form_cycle (new_start , cycle , visited_edge_indexes , unvisited_edge_node_dict )
147
154
148
155
return '->' .join ([ self .nodes [node ] for node in cycle ])
0 commit comments