天天看點

強連通分量tarjan算法模闆

tarjan(u)
{
    Dfn[u]=Low[u]=++Index                      // 為節點u設定次序編号和Low初值
    Stack.push(u)                              // 将節點u壓入棧中
    for each (u, v) in E                       // 枚舉每一條邊
        if (v is not visted)                   // 如果節點v未被通路過
            tarjan(v)                          // 繼續向下找
            Low[u] = min(Low[u], Low[v])
        else if (v in Stack)                   // 如果節點v還在棧内(很重要,無向圖沒有這一步)
            Low[u] = min(Low[u], Dfn[v])
    if (Dfn[u] == Low[u])                      // 如果節點u是強連通分量的根
        repeat
            v = Stack.pop                      // 将v退棧,為該強連通分量中一個頂點
            mark v                             // 标記v,同樣通過棧來找連通分量
        until (u == v)
}      

繼續閱讀