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 と同じです。しかし、すべての種類のグラフで強連結成分をうまく見つけることができるかどうかはわかりません。このアルゴリズムは正しいか、弱いテストケースしかパスできません。