# CSPT10 Graphs I
```
from collections import deque
class Graph:
def __init__(self):
self.vertices = {}
def __repr__(self):
return str(self.vertices)
def add_vertex(self, vertex_id):
if vertex_id not in self.vertices:
self.vertices[vertex_id] = set()
def add_edge(self, v1, v2):
if v1 in self.vertices and v2 in self.vertices:
self.vertices[v1].add(v2)
def get_neighbors(self, vertex_id):
return self.vertices[vertex_id] if vertex_id in self.vertices else set()
def dft(self, starting_vertex):
visited = set()
stack = deque()
stack.append(starting_vertex)
while len(stack) > 0:
currNode = stack.pop()
if currNode not in visited:
visited.add(currNode)
print(currNode)
for neighbor in self.get_neighbors(currNode):
stack.append(neighbor)
def bft(self, starting_vertex):
visited = set()
queue = deque()
queue.append(starting_vertex)
while len(queue) > 0:
currNode = queue.popleft()
if currNode not in visited:
visited.add(currNode)
print(currNode)
for neighbor in self.get_neighbors(currNode):
queue.append(neighbor)
# Returns path from starting vertex to destination vertex
def dfs(self, starting_vertex, destination_vertex):
stack = deque()
# Each element in the stack is the current path e.g [1, 2, 3..]
stack.append([starting_vertex])
visited = set()
while len(stack) > 0:
currPath = stack.pop() # [1, 2, 3]
currNode = currPath[-1] # 3
if currNode == destination_vertex:
return currPath
if currNode not in visited:
visited.add(currNode)
for neighbor in self.get_neighbors(currNode):
newPath = list(currPath)
newPath.append(neighbor)
stack.append(newPath)
g = Graph()
g.add_vertex(0)
g.add_vertex(1)
g.add_vertex(2)
g.add_vertex(3)
g.add_edge(0, 1)
g.add_edge(0, 2)
g.add_edge(1, 3)
g.add_edge(2, 3)
g.add_edge(3, 0)
g.bft(0)
```