Skip to content

Commit 4ba0ad2

Browse files
author
Hamid Gasmi
committed
#188 is completed
1 parent 6819226 commit 4ba0ad2

File tree

2 files changed

+21
-15
lines changed

2 files changed

+21
-15
lines changed

09-problems/graph-algorithms-in-genome-sequencing/eulerian_cycle.py

+20-13
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ def _build_graph(self, edges):
2525

2626
for a in self.adjacency_list[start_vertex_no]:
2727
self.reversed_adjacency_list[a].append(start_vertex_no)
28-
28+
2929
def _get_node_no(self, label, node_label_dict):
3030

3131
if label in node_label_dict:
@@ -70,6 +70,7 @@ def explore(self, v, adj, postOrderVisits):
7070
postOrderVisits.append(v)
7171

7272
def dfs(self, adj, postOrderVisits):
73+
7374
self.visited = [ False for _ in range(len(self.nodes)) ]
7475
for v in range(len(adj)):
7576
if not self.visited[v]:
@@ -99,22 +100,23 @@ def _is_strongly_connected(self):
99100
def _is_eulerian_graph(self):
100101

101102
# 1. Is balanced
102-
assert(self._is_balanced())
103+
#assert(self._is_balanced())
103104

104105
# 2. Is strongly connected
105-
assert(self._is_strongly_connected())
106+
#assert(self._is_strongly_connected())
107+
108+
return True
106109

107110
def form_cycle(self, start, cycle, visited_edge_indexes, unvisited_edge_node_dict):
108111

109112
node = start
110-
111113
while visited_edge_indexes[node] + 1 < len(self.adjacency_list[node]):
112114

113115
cycle.append(node)
114116

115117
# 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)
118120

119121
elif node in unvisited_edge_node_dict:
120122
unvisited_edge_node_dict.pop(node)
@@ -123,26 +125,31 @@ def form_cycle(self, start, cycle, visited_edge_indexes, unvisited_edge_node_dic
123125
node = self.adjacency_list[node][ visited_edge_indexes[node] ]
124126

125127
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+
129131
def eulerian_cycle(self):
130132

131133
cycle = []
132134
visited_edge_indexes = [-1 for _ in range(len(self.nodes))]
133135

134136
# nodes with unvisited edges: {node, position in cycle}
135137
unvisited_edge_node_dict = dict()
136-
138+
137139
new_start_pos_in_cycle = self.form_cycle(0, cycle, visited_edge_indexes, unvisited_edge_node_dict)
138140

139141
while new_start_pos_in_cycle != -1:
140-
142+
143+
new_start = cycle[new_start_pos_in_cycle]
141144
new_cycle = cycle[new_start_pos_in_cycle:]
142145
new_cycle.extend(cycle[1:new_start_pos_in_cycle])
143146
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+
146153
new_start_pos_in_cycle = self.form_cycle(new_start, cycle, visited_edge_indexes, unvisited_edge_node_dict)
147154

148155
return '->'.join([ self.nodes[node] for node in cycle])

0 commit comments

Comments
 (0)