Skip to content

Commit a832945

Browse files
author
Hamid Gasmi
committed
Issue 87 (Finding an Exit from a Maze): solved with a Graph BFS exploration
1 parent 4d34197 commit a832945

File tree

1 file changed

+41
-32
lines changed

1 file changed

+41
-32
lines changed

3-graph-algorithms/1_graph_decomposition/reachability.py

+41-32
Original file line numberDiff line numberDiff line change
@@ -2,37 +2,48 @@
22
from queue import Queue
33

44
class MazeGraph:
5-
def __init__(self, n, adj, solution):
6-
self.adj = adj
5+
def __init__(self, n, edges):
6+
self.adj = [[] for _ in range(n)]
7+
self.buildAdjacencyList(edges)
78
self.visited = [False] * n
8-
if solution == 2:
9-
self.enqueued = [False] * n
9+
10+
# Time Complexity: O(|E|)
11+
# Space Complexity: O(1)
12+
def buildAdjacencyList(self, edges):
13+
for (a, b) in edges:
14+
self.adj[a - 1].append(b - 1)
15+
self.adj[b - 1].append(a - 1)
1016

1117
def visit(self, v):
1218
self.visited[v] = True
1319

14-
def enqueue(self, q, v):
15-
if not self.enqueued[v]:
16-
q.put(v)
17-
self.enqueued[v] = True
18-
1920
def isVisited(self, v):
2021
return self.visited[v]
2122

23+
def explore(self, u, v, solution):
24+
if solution == 1:
25+
return self.explore_dfs(u, v)
26+
elif solution == 2:
27+
self.enqueued = [False] * n
28+
q = Queue(maxsize = len(self.visited))
29+
return self.explore_bfs(u, v, q)
30+
else:
31+
return 0
32+
2233
# Time Complexity: O(|V| + |E|):
2334
# .... Each vertex is explored exactly once
2435
# .... Each vertex checks each neighbor
2536
# Space Complexity: O(|V|):
26-
# .... Each vertex calls explore method recursively for 1 neighbor at a time
27-
# Good job! (Max time used: 0.03/5.00, max memory used: 9535488/536870912.)
37+
# .... Each vertex calls recursively explore method for 1 neighbor at a time
38+
# Result: Good job! (Max time used: 0.03/5.00, max memory used: 9535488/536870912.)
2839
def explore_dfs(self, u, v):
2940
if u == v:
3041
return 1
3142

3243
self.visit(u)
33-
for i in range(len(adj[u])):
34-
if not self.isVisited(adj[u][i]):
35-
if self.explore_dfs(adj[u][i], v) == 1:
44+
for i in range(len(self.adj[u])):
45+
if not self.isVisited(self.adj[u][i]):
46+
if self.explore_dfs(self.adj[u][i], v) == 1:
3647
return 1
3748

3849
return 0
@@ -42,7 +53,7 @@ def explore_dfs(self, u, v):
4253
# .... Each vertex checks each neighbor
4354
# Space Complexity: O(|V|):
4455
# .... Each vertex is enqueued only once
45-
# Result: Good job! (Max time used: 0.04/5.00, max memory used: 10084352/536870912.)
56+
# Result: Good job! (Max time used: 0.05/5.00, max memory used: 10067968/536870912.)
4657
def explore_bfs(self, u, v, q):
4758
if u == v:
4859
return 1
@@ -54,22 +65,24 @@ def explore_bfs(self, u, v, q):
5465
return 1
5566
self.visit(u)
5667

57-
for i in range(len(adj[u])):
58-
self.enqueue(q, adj[u][i])
59-
68+
for i in range(len(self.adj[u])):
69+
self.enqueue(q, self.adj[u][i])
6070
return 0
6171

62-
def reach(adj, n, u, v, solution):
72+
def enqueue(self, q, v):
73+
if not self.enqueued[v]:
74+
q.put(v)
75+
self.enqueued[v] = True
76+
77+
def reach(n, edges, u, v, solution):
78+
79+
if 1 <= solution <= 2:
80+
aMaze = MazeGraph(n, edges)
81+
return aMaze.explore(u, v, solution)
6382

64-
aMaze = MazeGraph(n, adj, solution)
65-
if solution == 1:
66-
return aMaze.explore_dfs(u, v)
67-
elif solution == 2:
68-
q = Queue(maxsize = n)
69-
return aMaze.explore_bfs(u, v, q)
70-
elif solution == 3:
83+
elif 3 <= solution == 4:
7184
return 0
72-
85+
# see reachability-disjoint-sets.py
7386
else:
7487
return 0
7588

@@ -80,10 +93,6 @@ def reach(adj, n, u, v, solution):
8093
data = data[2:]
8194
edges = list(zip(data[0:(2 * m):2], data[1:(2 * m):2]))
8295
x, y = data[2 * m:]
83-
adj = [[] for _ in range(n)]
8496
x, y = x - 1, y - 1
85-
for (a, b) in edges:
86-
adj[a - 1].append(b - 1)
87-
adj[b - 1].append(a - 1)
8897

89-
print(reach(adj, n, x, y, 2))
98+
print(reach(n, edges, x, y, 2))

0 commit comments

Comments
 (0)