0

Tarjan アルゴリズムには 2 つのインデックス配列があり、1 つは発見された順序でノードに連続番号を付けます。もう 1 つは、v から v のサブツリーを介して到達可能な最小のインデックスを表します。これは、アルゴリズムの擬似コードです。

    tarjan(u)
{
    DFN[u]=Low[u]=++Index                      
    Stack.push(u)                            
    for each (u, v) in E                    
        if (v is not visted)              
            tarjan(v)                
            Low[u] = min(Low[u], Low[v])
        else if (v in S)                  
            Low[u] = min(Low[u], DFN[v])
    if (DFN[u] == Low[u])                      
        repeat
            v = S.pop                  
            print v
        until (u== v)
}

しかし、低い配列は削除できると思います。アルゴリズムは次のように変更されます

tarjan(u)
{
    if(DFN[u]) // assume all elements in DFN is initialized to 0
        return DFN[u]
    DFN[u]=++Index                      
    Stack.push(u)      
    res = DFN[u]                     
    for each (u, v) in E                                          
        res = min(res, tarjan(v))
    if (DFN[u] == res)                      
        repeat
            v = S.pop                  
            print v
        until (u== v)
    return res
}

小さなグラフでいくつかのテストを行いましたが、結果は標準の tarjan と同じです。しかし、すべての種類のグラフで強連結成分をうまく見つけることができるかどうかはわかりません。このアルゴリズムは正しいか、弱いテストケースしかパスできません。

4

1 に答える 1