求解强连通分量的Tarjan算法描述

来源:互联网 发布:nginx生成ssl证书 编辑:程序博客网 时间:2024/05/21 22:58
输入:有向图 (V, E)


建立全局栈 S,初始为空
建立全局的映射(数组)TimeStamp: V → { 1, ..., |V| }
建立全局的映射(数组)GoBack: V → { 1, ..., |V| }
设置全局时间戳 GlobalTimeStamp ← 0


对每个 v ∈ V
    如果没有访问过 v 则
        调用 Tarjan(v)


其中,Tarjan(v) 的定义是:
    GlobalTimeStamp ← GlobalTimeStamp + 1
    标记 v 已经访问过
    TimeStamp(v) ← GlobalTimeStamp
    GoBack(v) ← GlobalTimeStamp
    向 S 中压入 v


    对每个使 (v, u) ∈ E 的 u(也就是可以由 v 直接到达的顶点 u)
        如果 u ∈ S 则
            GoBack(v) ← min { GoBack(v), TimeStamp(u) }
        如果没有访问过 u 则
            调用 Tarjan(u)
            GoBack(v) ← min { GoBack(v), GoBack(u) }


    如果 GoBack(v) = TimeStamp(v) 则
        不断弹出 S 的元素直到把 v 也弹出了
        输出刚刚弹出的这些顶点作为一个强连通分量
原创粉丝点击