-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdirectedGraph.py
More file actions
173 lines (132 loc) · 4.85 KB
/
Copy pathdirectedGraph.py
File metadata and controls
173 lines (132 loc) · 4.85 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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
class GraphNode():
def __init__(self,name) -> None:
self.name = name
self.data = None
def __repr__(self) -> str:
return f"{self.name}"
class DirectedGraph():
queue = []
bfsVisited = []
def __init__(self):
self.adjacencyList = {}
def addNode(self,node):
if node not in self.adjacencyList:
print(f"adding {node}, to adjancy list keys...")
self.adjacencyList[node] = []
else:
print(f"{node}, already in graph")
def addEdge(self,parentNode:object, edgeList:list):
if parentNode in self.adjacencyList:
for node in edgeList:
if node not in self.adjacencyList[parentNode]:
print(f"adding {node} to {parentNode}'s edges")
self.adjacencyList[parentNode].append(node)
else:
print(f"{node}, already in {parentNode} adjacency list.")
else:
print(f"{parentNode} not in graph, please add it to graph first.")
def depthFirstTraversal(self, startNode):
#iteratively
#use a stack
visited = set()
stack = [startNode]
while stack:
current = stack.pop()
if current not in visited:
visited.add(current)
neighbors = self.adjacencyList[current]
print(current)
for edge in reversed(neighbors):
if edge not in visited:
stack.append(edge)
return None
def dfsRecursive(self, source):
print(source)
for neighbor in self.adjacencyList[source]:
self.dfsRecursive(neighbor)
def breadthFirstTraversal(self, startNode = None):
#consider using deque better performance then using a list
"""
from collections import deque
"""
#my implementation of breadth first traversal, using recursion
#some suggestions from chat gpt, remove the current arg as it was not neccessary
#removed the length check of neighbors also not neccessary
#checks if it's the first call
if startNode != None:
self.queue.append(startNode)
#stop state is an empty queue
while self.queue:
#pulls first element out of queue
current = self.queue.pop(0)
print(current)
#adds element to visited to ensure it doesn't get called twice
if current not in self.bfsVisited:
self.bfsVisited.append(current)
#adds neighbor to queue
# if len(self.adjacencyList[current]) > 0:
for neighbhor in self.adjacencyList[current]:
if neighbhor not in self.bfsVisited:
self.queue.append(neighbhor)
#calls itself
self.breadthFirstTraversal()
def bfsIteratively(self, source):
queue = [source]
while queue:
current = queue.pop(0)
print(current)
for neighbor in self.adjacencyList[current]:
queue.append(neighbor)
def dfsRecursiveHasPath(self,source,dest):
print(source, dest)
if source == dest:
return True
for neighbor in self.adjacencyList[source]:
result = self.dfsRecursiveHasPath(neighbor, dest)
if result == True:
return True
return False
def bfsHasPath(self, source, dest):
queue = [source]
while queue:
current = queue.pop(0)
if current == dest:
return True
else:
for neighbor in self.adjacencyList[current]:
queue.append(neighbor)
return False
def main():
dGraph = DirectedGraph()
alphabet = ["a","b","c","d","e","f","g","h"]
nodeList = []
for letter in alphabet:
node = GraphNode(name=letter)
nodeList.append(node)
for node in nodeList:
dGraph.addNode(node)
aEdges = [nodeList[1],nodeList[2],nodeList[6],nodeList[7]]
bEdges = [nodeList[3]]
cEdges = [nodeList[4]]
eEdges = [nodeList[1]]
fEdges = [nodeList[3]]
#adding edges to a
dGraph.addEdge(nodeList[0],aEdges)
#adding edge to b
dGraph.addEdge(nodeList[1],bEdges)
#adding edge to c
dGraph.addEdge(nodeList[2],cEdges)
#adding edge to e
dGraph.addEdge(nodeList[4],eEdges)
#adding edge to f
dGraph.addEdge(nodeList[5],fEdges)
#dGraph.depthFirstTraversal(nodeList[0])
#dGraph.breadthFirstTraversal(startNode=nodeList[0])
#dGraph.dfsRecursive(nodeList[0])
#dGraph.bfsIteratively(nodeList[0])
print(dGraph.dfsRecursiveHasPath(nodeList[0],nodeList[5]))
print(dGraph.bfsHasPath(nodeList[0],nodeList[3]))
#print(dGraph.queue)
#print(dGraph.adjacencyList)
if __name__ == "__main__":
main()