Analyzer.ConnectedComponentCalculator.RunTarjanAlgorithm C# (CSharp) Method

RunTarjanAlgorithm() protected method

protected RunTarjanAlgorithm ( IVertex oVertex, Stack oStack, List oStronglyConnectedComponents, Int32 &iNextIndex ) : void
oVertex IVertex
oStack Stack
oStronglyConnectedComponents List
iNextIndex System.Int32
return void
        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);
            }
        }