Analyzer.ConnectedComponentCalculator.CalculateStronglyConnectedComponents C# (CSharp) Method

CalculateStronglyConnectedComponents() public method

public CalculateStronglyConnectedComponents ( ICollection vertices, IGraph graph, System.Boolean sortAscending ) : IList>
vertices ICollection
graph IGraph
sortAscending System.Boolean
return IList>
        CalculateStronglyConnectedComponents
        (
            ICollection<IVertex> vertices,
            IGraph graph,
            Boolean sortAscending
        )
        {
            Debug.Assert(vertices != null);
            Debug.Assert(graph != null);

            Int32 iNextIndex = 0;
            Stack<IVertex> oStack = new Stack<IVertex>();

            // Note: A List is used instead of a LinkedList for the strongly
            // connected components only because LinkedList does not have a Sort()
            // method.

            List<LinkedList<IVertex>> oStronglyConnectedComponents =
                new List<LinkedList<IVertex>>();

            foreach (IVertex oVertex in vertices)
            {
                if (!oVertex.ContainsKey(
                    ReservedMetadataKeys.ConnectedComponentCalculatorIndex))
                {
                    RunTarjanAlgorithm(oVertex, oStack,
                        oStronglyConnectedComponents, ref iNextIndex);
                }
            }

            SortStronglyConnectedComponents(oStronglyConnectedComponents, graph,
                sortAscending);

            // Remove the metadata that was added to each vertex.

            foreach (IVertex oVertex in vertices)
            {
                oVertex.RemoveKey(
                    ReservedMetadataKeys.ConnectedComponentCalculatorIndex);

                oVertex.RemoveKey(
                    ReservedMetadataKeys.ConnectedComponentCalculatorLowLink);
            }

            return (oStronglyConnectedComponents);
        }

Same methods

ConnectedComponentCalculator::CalculateStronglyConnectedComponents ( IGraph graph, System.Boolean sortAscending ) : IList>

Usage Example

        protected void CalculateConnectedComponentMetrics
        (
            IGraph oGraph,
            out Int32 iConnectedComponents,
            out Int32 iSingleVertexConnectedComponents,
            out Int32 iMaximumConnectedComponentVertices,
            out Int32 iMaximumConnectedComponentEdges
        )
        {
            Debug.Assert(oGraph != null);


            ConnectedComponentCalculator oConnectedComponentCalculator =
                new ConnectedComponentCalculator();

            IList<LinkedList<IVertex>> oConnectedComponents =
                oConnectedComponentCalculator.CalculateStronglyConnectedComponents(
                    oGraph, true);

            iConnectedComponents = oConnectedComponents.Count;
            iSingleVertexConnectedComponents = 0;
            iMaximumConnectedComponentVertices = 0;
            iMaximumConnectedComponentEdges = 0;

            foreach (LinkedList<IVertex> oConnectedComponent in
                oConnectedComponents)
            {
                Int32 iVertices = oConnectedComponent.Count;

                if (iVertices == 1)
                {
                    iSingleVertexConnectedComponents++;
                }

                iMaximumConnectedComponentVertices = Math.Max(
                    iMaximumConnectedComponentVertices, iVertices);

                iMaximumConnectedComponentEdges = Math.Max(
                    iMaximumConnectedComponentEdges,
                    CountUniqueEdges(oConnectedComponent));
            }
        }