Сильно связанные компоненты - стек
Можно ли реализовать поиск сильно связанных компонентов на основе имеющегося у меня кода? Я не могу придумать, как это сделать. Я попытался реализовать Kosaraju, но безуспешно, потому что он рекурсивный и я использую стек. Все реализации Kosaraju работают, имея в начале заданное количество вершин, но я хотел бы сохранить гибкость функции "добавить вершину".
class Graph:
def __init__(self):
self.graph = {}
def add_vertex(self, vertex_name):
self.graph[vertex_name] = []
def add_side(self, start, end):
self.graph[start].append(end)
def adjacent(self, vertex_name):
adjacent = self.graph[vertex_name][:]
adjacent.reverse()
return adjacent
def length(self):
return len(self.graph.keys())
class Stack:
def __init__(self):
self.stack = []
def push(self, x):
self.stack = [x] + self.stack
def pop(self):
if self.is_empty():
return None
else:
value = self.stack[0]
self.stack = self.stack[1:]
return value
def is_empty(self):
return self.stack == []
def __str__(self):
return ", ".join(map(str, self.stack))
def dfs(graph, start):
stack = Stack()
stack.push(start)
in_reach = []
while not stack.is_empty():
vertex = stack.pop()
if not vertex in in_reach:
in_reach.append(vertex)
adjacent = graph.adjacent(vertex)
for adj in adjacent:
stack.push(adj)
return in_reach
g = Graph()
vertices = [0,1,2,3,4,5]
for n in vertices:
g.add_vertex(n)
g.add_side(vertices[1], vertices[2])
g.add_side(vertices[1], vertices[3])
g.add_side(vertices[2], vertices[3])
g.add_side(vertices[2], vertices[5])
g.add_side(vertices[3], vertices[4])
g.add_side(vertices[4], vertices[1])