2
2
from queue import Queue
3
3
4
4
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 )
7
8
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 )
10
16
11
17
def visit (self , v ):
12
18
self .visited [v ] = True
13
19
14
- def enqueue (self , q , v ):
15
- if not self .enqueued [v ]:
16
- q .put (v )
17
- self .enqueued [v ] = True
18
-
19
20
def isVisited (self , v ):
20
21
return self .visited [v ]
21
22
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
+
22
33
# Time Complexity: O(|V| + |E|):
23
34
# .... Each vertex is explored exactly once
24
35
# .... Each vertex checks each neighbor
25
36
# 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.)
28
39
def explore_dfs (self , u , v ):
29
40
if u == v :
30
41
return 1
31
42
32
43
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 :
36
47
return 1
37
48
38
49
return 0
@@ -42,7 +53,7 @@ def explore_dfs(self, u, v):
42
53
# .... Each vertex checks each neighbor
43
54
# Space Complexity: O(|V|):
44
55
# .... 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.)
46
57
def explore_bfs (self , u , v , q ):
47
58
if u == v :
48
59
return 1
@@ -54,22 +65,24 @@ def explore_bfs(self, u, v, q):
54
65
return 1
55
66
self .visit (u )
56
67
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 ])
60
70
return 0
61
71
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 )
63
82
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 :
71
84
return 0
72
-
85
+ # see reachability-disjoint-sets.py
73
86
else :
74
87
return 0
75
88
@@ -80,10 +93,6 @@ def reach(adj, n, u, v, solution):
80
93
data = data [2 :]
81
94
edges = list (zip (data [0 :(2 * m ):2 ], data [1 :(2 * m ):2 ]))
82
95
x , y = data [2 * m :]
83
- adj = [[] for _ in range (n )]
84
96
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 )
88
97
89
- print (reach (adj , n , x , y , 2 ))
98
+ print (reach (n , edges , x , y , 2 ))
0 commit comments