Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 69 additions & 0 deletions src/Graph/graph.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
class Graph:
def __init__(self, directed: bool = False) -> None:
self.adjacency_list: dict[str, list[str]] = {}
self.directed: bool = directed
self.vertices: set[str] = set()

def add_edge(self, vertex_1: str, vertex_2: str):
if vertex_1 not in self.adjacency_list:
self.adjacency_list[vertex_1] = []
self.adjacency_list[vertex_1].append(vertex_2)
self.vertices.add(vertex_1)
self.vertices.add(vertex_2)

if vertex_2 not in self.adjacency_list:
self.adjacency_list[vertex_2] = []

if not self.directed:
self.adjacency_list[vertex_2].append(vertex_1)

def add_vertex(self, vertex: str):
if vertex not in self.adjacency_list:
self.adjacency_list[vertex] = []
self.vertices.add(vertex)

def dfs(self, start_vertex) -> list[str]:
if start_vertex not in self.vertices:
return []

visited = []
stack = [start_vertex]
seen = set()

while stack:
vertex = stack.pop()

if vertex not in seen:
visited.append(vertex)
seen.add(vertex)

neighbors = self.adjacency_list.get(vertex, [])

for index in range(len(neighbors) - 1, -1, -1):
neighbor = neighbors[index]
if neighbor not in seen:
stack.append(neighbor)

return visited

def __iter__(self):
all_vertices = list(self.vertices)

if not all_vertices:
return iter([])

dfs_order = self.dfs(all_vertices[0])

return iter(dfs_order)

def __str__(self) -> str:
result = []
result.append(f"Graph (oriented: {self.directed})")
result.append("Adjacency list:")

vertices = sorted(self.adjacency_list.keys())
for vertex in vertices:
neighbors = self.adjacency_list[vertex]
result.append(f" {vertex}: {neighbors}")

return "\n".join(result)