Сильно связанные компоненты - стек

Можно ли реализовать поиск сильно связанных компонентов на основе имеющегося у меня кода? Я не могу придумать, как это сделать. Я попытался реализовать 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])

0 ответов

Другие вопросы по тегам