Skip to content

Commit 451c4a9

Browse files
committed
Added graph bfs and dfs
1 parent 409d8b5 commit 451c4a9

File tree

3 files changed

+318
-17
lines changed

3 files changed

+318
-17
lines changed

Graph/bfs.py

+107
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
2+
# IMPLEMENTING BFS
3+
4+
class Vertex(object):
5+
def __init__(self, key):
6+
self.id = key
7+
self.connectedTo = {}
8+
9+
def addNeighbor(self, nbr, w):
10+
self.connectedTo[nbr] = w
11+
12+
def getConnections(self):
13+
return self.connectedTo.keys()
14+
15+
def getId(self):
16+
return self.id
17+
18+
def getWeight(self, nbr):
19+
return self.connectedTo[nbr]
20+
21+
def __str__(self):
22+
return str(self.id) + " connected to " + str([x.id for x in self.connectedTo])
23+
24+
class Graph(object):
25+
def __init__(self):
26+
self.vertices = {}
27+
self.numVertices = 0
28+
29+
def addVertex(self, key):
30+
self.numVertices += 1
31+
temp = Vertex(key)
32+
self.vertices[key] = temp
33+
34+
def getVertex(self, key):
35+
if key in self.vertices:
36+
return self.vertices[key]
37+
return None
38+
39+
def addEdge(self, fro, to, cost=0):
40+
if fro not in self.vertices:
41+
self.addVertex(fro)
42+
if to not in self.vertices:
43+
self.addVertex(to)
44+
self.vertices[fro].addNeighbor(self.vertices[to], cost)
45+
46+
def getVertices(self):
47+
return self.vertices.keys()
48+
49+
def __iter__(self):
50+
return iter(self.vertices.values())
51+
52+
def __contains__(self, n):
53+
return n in self.vertices
54+
55+
def bfs(graph, start):
56+
if not graph:
57+
return
58+
visited = []
59+
queue = [start]
60+
while len(queue) > 0:
61+
vertex = queue.pop(0)
62+
if vertex not in visited:
63+
visited.append(vertex)
64+
for adj in vertex.connectedTo:
65+
if adj not in visited:
66+
queue.append(adj)
67+
return visited
68+
69+
def recursiveBFS(q, visited):
70+
if len(q) == 0:
71+
return
72+
73+
x = q.pop(0)
74+
if x not in visited:
75+
visited.append(x)
76+
for k in x.connectedTo:
77+
if k not in visited:
78+
q.append(k)
79+
recursiveBFS(q, visited)
80+
81+
82+
if __name__ == "__main__":
83+
g = Graph()
84+
for i in range(1, 9):
85+
g.addVertex(i)
86+
87+
g.addEdge(1, 2, 1)
88+
g.addEdge(1, 3, 1)
89+
g.addEdge(3, 4, 1)
90+
g.addEdge(4, 6, 1)
91+
g.addEdge(4, 5, 1)
92+
g.addEdge(6, 7, 1)
93+
g.addEdge(7, 8, 1)
94+
g.addEdge(5, 8, 1)
95+
96+
re = bfs(g, g.getVertex(1))
97+
visited = []
98+
recursiveBFS([g.getVertex(1)], visited)
99+
100+
print("RECURSIVE:")
101+
for k in visited:
102+
print(k.id)
103+
104+
print("ITERATIVE:")
105+
for k in re:
106+
print(k.id)
107+

Graph/dfs.py

+107
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
2+
# IMPLEMENTING DFS
3+
4+
class Vertex(object):
5+
def __init__(self, key):
6+
self.id = key
7+
self.connectedTo = {}
8+
9+
def addNeighbor(self, nbr, w):
10+
self.connectedTo[nbr] = w
11+
12+
def getConnections(self):
13+
return self.connectedTo.keys()
14+
15+
def getId(self):
16+
return self.id
17+
18+
def getWeight(self, nbr):
19+
return self.connectedTo[nbr]
20+
21+
def __str__(self):
22+
return str(self.id) + " connected to " + str([x.id for x in self.connectedTo])
23+
24+
class Graph(object):
25+
def __init__(self):
26+
self.vertices = {}
27+
self.numVertices = 0
28+
29+
def addVertex(self, key):
30+
self.numVertices += 1
31+
temp = Vertex(key)
32+
self.vertices[key] = temp
33+
34+
def getVertex(self, key):
35+
if key in self.vertices:
36+
return self.vertices[key]
37+
return None
38+
39+
def addEdge(self, fro, to, cost=0):
40+
if fro not in self.vertices:
41+
self.addVertex(fro)
42+
if to not in self.vertices:
43+
self.addVertex(to)
44+
self.vertices[fro].addNeighbor(self.vertices[to], cost)
45+
46+
def getVertices(self):
47+
return self.vertices.keys()
48+
49+
def __iter__(self):
50+
return iter(self.vertices.values())
51+
52+
def __contains__(self, n):
53+
return n in self.vertices
54+
55+
def dfs(graph, start):
56+
if not graph:
57+
return
58+
visited = []
59+
stack = [start]
60+
while len(stack) > 0:
61+
vertex = stack.pop()
62+
if vertex not in visited:
63+
visited.append(vertex)
64+
for adj in vertex.connectedTo:
65+
if adj not in visited:
66+
stack.append(adj)
67+
return visited
68+
69+
def recursiveDFS(q, visited):
70+
if len(q) == 0:
71+
return
72+
73+
x = q.pop()
74+
if x not in visited:
75+
visited.append(x)
76+
for k in x.connectedTo:
77+
if k not in visited:
78+
q.append(k)
79+
recursiveDFS(q, visited)
80+
81+
82+
if __name__ == "__main__":
83+
g = Graph()
84+
for i in range(1, 9):
85+
g.addVertex(i)
86+
87+
g.addEdge(1, 2, 1)
88+
g.addEdge(1, 3, 1)
89+
g.addEdge(3, 4, 1)
90+
g.addEdge(4, 6, 1)
91+
g.addEdge(4, 5, 1)
92+
g.addEdge(6, 7, 1)
93+
g.addEdge(7, 8, 1)
94+
g.addEdge(5, 8, 1)
95+
96+
re = dfs(g, g.getVertex(1))
97+
visited = []
98+
recursiveDFS([g.getVertex(1)], visited)
99+
100+
print("RECURSIVE:")
101+
for k in visited:
102+
print(k.id)
103+
104+
print("ITERATIVE:")
105+
for k in re:
106+
print(k.id)
107+

test.py

+104-17
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,107 @@
11

2-
def mincoins(target, coins, known):
3-
# min_coins = target
4-
res = []
5-
if target in coins:
6-
known[target] = [target]
7-
return [target]
8-
9-
elif known[target] != None:
10-
return known[target]
11-
12-
else:
13-
for i in [c for c in coins if c <= target]:
14-
x = mincoins(target - i, coins, known)
15-
res += [x, i]
16-
known[target] = res
17-
return res
2+
# IMPLEMENTING DFS
3+
4+
class Vertex(object):
5+
def __init__(self, key):
6+
self.id = key
7+
self.connectedTo = {}
8+
9+
def addNeighbor(self, nbr, w):
10+
self.connectedTo[nbr] = w
11+
12+
def getConnections(self):
13+
return self.connectedTo.keys()
14+
15+
def getId(self):
16+
return self.id
17+
18+
def getWeight(self, nbr):
19+
return self.connectedTo[nbr]
20+
21+
def __str__(self):
22+
return str(self.id) + " connected to " + str([x.id for x in self.connectedTo])
23+
24+
class Graph(object):
25+
def __init__(self):
26+
self.vertices = {}
27+
self.numVertices = 0
28+
29+
def addVertex(self, key):
30+
self.numVertices += 1
31+
temp = Vertex(key)
32+
self.vertices[key] = temp
33+
34+
def getVertex(self, key):
35+
if key in self.vertices:
36+
return self.vertices[key]
37+
return None
38+
39+
def addEdge(self, fro, to, cost=0):
40+
if fro not in self.vertices:
41+
self.addVertex(fro)
42+
if to not in self.vertices:
43+
self.addVertex(to)
44+
self.vertices[fro].addNeighbor(self.vertices[to], cost)
45+
46+
def getVertices(self):
47+
return self.vertices.keys()
48+
49+
def __iter__(self):
50+
return iter(self.vertices.values())
51+
52+
def __contains__(self, n):
53+
return n in self.vertices
54+
55+
def dfs(graph, start):
56+
if not graph:
57+
return
58+
visited = []
59+
stack = [start]
60+
while len(stack) > 0:
61+
vertex = stack.pop()
62+
if vertex not in visited:
63+
visited.append(vertex)
64+
for adj in vertex.connectedTo:
65+
if adj not in visited:
66+
stack.append(adj)
67+
return visited
68+
69+
def recursiveDFS(q, visited):
70+
if len(q) == 0:
71+
return visited
72+
73+
x = q.pop()
74+
if x not in visited:
75+
visited.append(x)
76+
for k in x.connectedTo:
77+
if k not in visited:
78+
q.append(k)
79+
return recursiveDFS(q, visited)
80+
1881

1982
if __name__ == "__main__":
20-
print(mincoins(10, [5, 3], [None]*11))
83+
g = Graph()
84+
for i in range(1, 9):
85+
g.addVertex(i)
86+
87+
g.addEdge(1, 2, 1)
88+
g.addEdge(1, 3, 1)
89+
g.addEdge(3, 4, 1)
90+
g.addEdge(4, 6, 1)
91+
g.addEdge(4, 5, 1)
92+
g.addEdge(6, 7, 1)
93+
g.addEdge(7, 8, 1)
94+
g.addEdge(5, 8, 1)
95+
96+
re = dfs(g, g.getVertex(1))
97+
vis = recursiveDFS([g.getVertex(1)], [])
98+
99+
100+
print("RECURSIVE:")
101+
for k in vis:
102+
print(k.id)
103+
104+
print("ITERATIVE:")
105+
for k in re:
106+
print(k.id)
107+

0 commit comments

Comments
 (0)