RunTarjanAlgorithm
(
IVertex oVertex,
Stack<IVertex> oStack,
List<LinkedList<IVertex>> oStronglyConnectedComponents,
ref Int32 iNextIndex
)
{
Debug.Assert(oVertex != null);
Debug.Assert(!oVertex.ContainsKey(
ReservedMetadataKeys.ConnectedComponentCalculatorIndex));
Debug.Assert(oStack != null);
Debug.Assert(oStronglyConnectedComponents != null);
Debug.Assert(iNextIndex >= 0);
SetIndex(oVertex, iNextIndex);
SetLowLink(oVertex, iNextIndex);
iNextIndex++;
oStack.Push(oVertex);
foreach (IEdge oIncidentEdge in oVertex.IncidentEdges)
{
IVertex oAdjacentVertex = oIncidentEdge.GetAdjacentVertex(oVertex);
if (!oAdjacentVertex.ContainsKey(
ReservedMetadataKeys.ConnectedComponentCalculatorIndex))
{
RunTarjanAlgorithm(oAdjacentVertex, oStack,
oStronglyConnectedComponents, ref iNextIndex);
SetLowLink(oVertex,
Math.Min(GetLowLink(oVertex), GetLowLink(oAdjacentVertex))
);
}
else if (oStack.Contains(oAdjacentVertex))
{
SetLowLink(oVertex,
Math.Min(GetLowLink(oVertex), GetIndex(oAdjacentVertex))
);
}
}
if (GetLowLink(oVertex) == GetIndex(oVertex))
{
LinkedList<IVertex> oStronglyConnectedComponent =
new LinkedList<IVertex>();
IVertex oVertexInComponent;
do
{
oVertexInComponent = oStack.Pop();
oStronglyConnectedComponent.AddLast(oVertexInComponent);
} while (oVertexInComponent.ID != oVertex.ID);
oStronglyConnectedComponents.Add(oStronglyConnectedComponent);
}
}