-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathconnected_graph_solution.py
More file actions
47 lines (40 loc) · 1.44 KB
/
connected_graph_solution.py
File metadata and controls
47 lines (40 loc) · 1.44 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
from math import inf
class Node(object):
def __init__(self, value, edges=None):
self.value = value
#What is the purpose of this construct?
self.edges = edges or []
def connected_to(self, target):
#What are the downsides of this depth-first solution?
if self == target:
return True
else:
#Why do we use 'any'?
return any(edge.connected_to(target) for edge in self.edges)
def connected_to_cyclic(self, target, visited=None):
#Why do we use a set here?
visited = set(visited or [])
if self in visited:
return False
elif self == target:
return True
else:
visited.add(self)
return any(edge.connected_to_cyclic(target, visited) for edge in self.edges)
def distance_to(self, target, visited=None, travelled=0):
visited = set(visited or [])
if self in visited:
return inf
elif self == target:
return travelled
else:
visited.add(self)
travelled += 1
if len(self.edges):
return min(edge.distance_to(target, visited, travelled) for edge in self.edges)
return inf
#What capabilites will adding the following methods give instances of this class?
def __eq__(self, other):
return self.value == other.value
def __hash__(self):
return hash(self.value)