-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path17_graphsWithAdjMatrixHashmap.py
More file actions
41 lines (35 loc) · 1.22 KB
/
Copy path17_graphsWithAdjMatrixHashmap.py
File metadata and controls
41 lines (35 loc) · 1.22 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
class Graph:
def __init__(self, vertices: list[str], is_dir: bool):
self.is_dir = is_dir
self.adj = {v: set() for v in vertices}
def _check(self, v):
if v not in self.adj:
raise KeyError(f"Vertex {v!r} not in graph")
def add_vertex(self, v: str):
if v not in self.adj:
self.adj[v] = set()
def connect_edge(self, u: str, v: str):
self._check(u); self._check(v)
self.adj[u].add(v)
if not self.is_dir:
self.adj[v].add(u)
print(f"edge created: {u} -> {v}" + ("" if self.is_dir else " (undirected)"))
def disconnect_edge(self, u: str, v: str):
self._check(u); self._check(v)
self.adj[u].discard(v)
if not self.is_dir:
self.adj[v].discard(u)
print(f"edge removed: {u} -/-> {v}" + ("" if self.is_dir else " (undirected)"))
def get_graph(self):
for v in self.adj:
print(f"{v}: {sorted(self.adj[v])}" if self.adj[v] else f"{v}: []")
g = Graph(["a","b","c","d"], is_dir=False)
g.get_graph()
g.connect_edge("a","b")
g.connect_edge("b","c")
g.connect_edge("c","d")
g.connect_edge("d","a")
g.connect_edge("a","c")
g.get_graph()
g.disconnect_edge("a","c")
g.get_graph()