Skip to content

Commit 4b4e512

Browse files
committed
graph_adt.py => wip bfs
Signed-off-by: ABHIJIT SINHA <[email protected]>
1 parent ed200fe commit 4b4e512

File tree

1 file changed

+152
-0
lines changed

1 file changed

+152
-0
lines changed

problem_solving/graph/graph_adt.py

Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
#!/usr/bin/env python3
2+
3+
# author: greyshell
4+
# description: graph adt
5+
6+
from typing import List
7+
from collections import deque
8+
9+
10+
class Vertex:
11+
"""
12+
implementation of a vertex / node of a DAG
13+
"""
14+
15+
def __init__(self, key):
16+
self._key = key
17+
self._neighbors = []
18+
19+
def add_neighbor(self, neighbor_vertex, weight):
20+
self._neighbors.append((neighbor_vertex, weight))
21+
22+
def get_key(self):
23+
return self._key
24+
25+
def get_connections(self):
26+
return self._neighbors
27+
28+
def get_weight(self, to_vertex):
29+
for neighbor in self._neighbors:
30+
if to_vertex == neighbor[0].get_key():
31+
return neighbor[1]
32+
33+
34+
class Graph(object):
35+
"""
36+
implementation of DAG ADT
37+
"""
38+
39+
def __init__(self, graph_dict=None):
40+
if graph_dict is None:
41+
self._graph = {}
42+
self._vertices = {}
43+
else:
44+
self._graph = graph_dict
45+
# add vertices
46+
for v in self._graph:
47+
self.add_vertex(v)
48+
# add edges
49+
for v in self._graph:
50+
for e in self._graph[v]:
51+
self.add_edge(v, e[0], e[1])
52+
53+
def add_vertex(self, vertex):
54+
v = Vertex(vertex)
55+
self._vertices[vertex] = v
56+
57+
def add_edge(self, from_vertex, to_vertex, weight):
58+
if from_vertex not in self._vertices:
59+
self.add_vertex(from_vertex)
60+
61+
if to_vertex not in self._vertices:
62+
self.add_vertex(to_vertex)
63+
64+
self._vertices[from_vertex].add_neighbor(self._vertices[to_vertex], weight)
65+
66+
def get_vertices(self):
67+
vertices = []
68+
for v in self._vertices.keys():
69+
vertices.append(v)
70+
return vertices
71+
72+
def get_vertex(self, vertex_key):
73+
for vertex in self._vertices:
74+
if vertex == vertex_key:
75+
return self._vertices[vertex]
76+
77+
def get_edges(self):
78+
edges = []
79+
for vertex in self._vertices:
80+
neighbors = self._vertices[vertex].get_connections()
81+
82+
for neighbor in neighbors:
83+
to_vertex = neighbor[0].get_key()
84+
edges.append((vertex, to_vertex, self._vertices[vertex].get_weight(to_vertex)))
85+
86+
return edges
87+
88+
def BFS(self, start_vertex=None):
89+
# TBD
90+
start_vertex = self.get_vertex(start_vertex)
91+
92+
if start_vertex is None:
93+
raise Exception(f"vertex: {start_vertex} is not found in graph")
94+
95+
visited = [False] * len(self._vertices)
96+
traversed = []
97+
98+
q = Queue()
99+
q.enqueue(start_vertex)
100+
101+
while not q.isEmpty():
102+
v = q.dequeue()
103+
key = v.get_key()
104+
105+
if not visited[key]:
106+
visited[key] = True
107+
traversed.append(key)
108+
109+
for neighbor in v.get_connections():
110+
if not visited[neighbor[0].get_key()]:
111+
q.enqueue(neighbor[0])
112+
113+
return traversed
114+
115+
116+
def main():
117+
g = Graph()
118+
119+
# add vertex
120+
for v in range(0, 5):
121+
g.add_vertex(v)
122+
123+
# add edges
124+
g.add_edge(0, 1, 5)
125+
g.add_edge(0, 2, 3)
126+
g.add_edge(1, 3, 3)
127+
g.add_edge(2, 1, 2)
128+
g.add_edge(2, 3, 5)
129+
g.add_edge(2, 4, 6)
130+
g.add_edge(4, 3, 1)
131+
132+
print(f"vertices: {g.get_vertices()}")
133+
print(f"edges: {g.get_edges()}")
134+
print(f"bfs: the nodes traversed from {0} are: {g.BFS(0)}")
135+
136+
print("")
137+
# taking graph as a dictionary
138+
# d = {
139+
# "0": [("1", 5), ("2", 3)],
140+
# "1": [("3", 3)],
141+
# "2": [("1", 2), ("3", 5), ("4", 6)],
142+
# "3": [],
143+
# "4": [("3", 1)]
144+
# }
145+
#
146+
# g1 = Graph(graph_dict=d)
147+
# print(f"vertices: {g1.get_vertices()}")
148+
# print(f"edges: {g1.get_edges()}")
149+
150+
151+
if __name__ == '__main__':
152+
main()

0 commit comments

Comments
 (0)