【问题标题】:Tarjan's strong connected component wrong or my code is wrong?Tarjan的强连接组件错了还是我的代码错了?
【发布时间】:2017-01-07 23:20:54
【问题描述】:

我正在尝试实现 Tarjan 的强连接图算法 (https://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm),这是我的代码,我很困惑为什么顶点 4 和顶点 5 也作为强连接组件输出?

我正在使用一个非常简单的图表,只有 5 个节点要测试。我的代码是用 Python 2.7 编写的。

from collections import defaultdict
class SccGraph:
    def __init__(self, vertex_size):
        self.out_neighbour = defaultdict(list)
        self.vertex = set()
        self.visited = set()
        self.index = defaultdict(int)
        self.low_index = defaultdict(int)
        self.global_index = 0
        self.visit_stack = []
        self.scc = []
    def add_edge(self, from_node, to_node):
        self.vertex.add(from_node)
        self.vertex.add(to_node)
        self.out_neighbour[from_node].append(to_node)
    def dfs_graph(self):
        for v in self.vertex:
            if v not in self.visited:
                self.dfs_node(v)
    def dfs_node(self, v):
        # for safe protection
        if v in self.visited:
            return
        self.index[v] = self.global_index
        self.low_index[v] = self.global_index
        self.global_index += 1
        self.visit_stack.append(v)
        self.visited.add(v)
        for n in self.out_neighbour[v]:
            if n not in self.visited:
                self.dfs_node(n)
                self.low_index[v] = min(self.low_index[v], self.low_index[n])
            elif n in self.visit_stack:
                self.low_index[v] = min(self.low_index[v], self.index[n])
        result = []
        if self.low_index[v] == self.index[v]:
            w = self.visit_stack.pop(-1)
            while w != v:
                result.append(w)
                w = self.visit_stack.pop(-1)
            result.append(v)
            self.scc.append(result)

if __name__ == "__main__":
    g = SccGraph(5)
    # setup a graph 1->2->3 and 3 -> 1 which forms a scc
    # setup another two edges 3->4 and 4->5
    g.add_edge(1,2)
    g.add_edge(2,3)
    g.add_edge(3,1)
    g.add_edge(3,4)
    g.add_edge(4,5)
    g.dfs_graph()
    print g.scc

【问题讨论】:

    标签: python algorithm python-2.7 graph strongly-connected-graph


    【解决方案1】:

    每个顶点都是强连接的。如果它不属于任何更大的强连通子图,那么它已经是强成分。所以你的实现和 Tarjan 的算法都很好。 (我没有检查你是否有任何其他错误)。

    【讨论】:

    • 投票。困惑为什么单个顶点是强连接的?我认为根据定义,如果一个顶点对自身有一个边点,那么它是强连接的?
    • 你可以从自身到达顶点 v。所以它是强连接的。
    • 感谢赛义德,即使没有明确的边缘指向自己?我认为可能是图中的一个顶点是否可以自行到达图中的一个灰色区域?
    • @Lin,顾名思义,可达点就是访问那个顶点。因此,当我们在顶点时,您无需进行任何额外的移动即可到达它。例如。我们几乎总是说顶点与自身的距离为零。
    • 更明确地说,通常在图论中,如果单个顶点不属于任何具有至少 2 个顶点的强分量,则称为平凡强分量。
    猜你喜欢
    • 2018-01-29
    • 1970-01-01
    • 1970-01-01
    • 2017-09-28
    • 2018-12-22
    • 2011-07-20
    • 2012-12-08
    • 1970-01-01
    • 2011-01-11
    相关资源
    最近更新 更多