public void GraphWithoutSelfEdges()
        {
            AdjacencyGraph g = new AdjacencyGraph(
                new QuickGraph.Providers.VertexAndEdgeProvider(),
                true);

            RandomGraph.Graph(g, 20, 100, new Random(), false);

            DepthFirstSearchAlgorithm dfs = new DepthFirstSearchAlgorithm(g);

            dfs.StartVertex        += new VertexHandler(this.StartVertex);
            dfs.DiscoverVertex     += new VertexHandler(this.DiscoverVertex);
            dfs.ExamineEdge        += new EdgeHandler(this.ExamineEdge);
            dfs.TreeEdge           += new EdgeHandler(this.TreeEdge);
            dfs.BackEdge           += new EdgeHandler(this.BackEdge);
            dfs.ForwardOrCrossEdge += new EdgeHandler(this.FowardOrCrossEdge);
            dfs.FinishVertex       += new VertexHandler(this.FinishVertex);

            Parents.Clear();
            DiscoverTimes.Clear();
            FinishTimes.Clear();
            m_Time = 0;

            foreach (IVertex v in g.Vertices)
            {
                Parents[v] = v;
            }

            // compute
            dfs.Compute();

            CheckDfs(g, dfs);
        }
        /// <inheritdoc />
        protected override void Initialize()
        {
            base.Initialize();

            ComponentsPerStep = new List <int>();
            VerticesPerStep   = new List <TVertex>();

            Components.Clear();
            Roots.Clear();
            DiscoverTimes.Clear();
            _stack.Clear();
            ComponentCount = 0;
            _dfsTime       = 0;
        }
        public void GraphWithSelfEdgesPUT(AdjacencyGraph g, int loopBound, bool self)
        {
            Random rnd; //new Random();
            var    choose1 = PexChoose.FromCall(this);

            rnd = choose1.ChooseValue <Random>("Random object");
            Init();
            for (int i = 0; i < loopBound; ++i)
            {
                for (int j = 0; j < i * i; ++j)
                {
                    RandomGraph.Graph(g, i, j, rnd, true);
                    Init();
                    DepthFirstSearchAlgorithm dfs = new DepthFirstSearchAlgorithm(g);
                    dfs.StartVertex        += new VertexHandler(this.StartVertex);
                    dfs.DiscoverVertex     += new VertexHandler(this.DiscoverVertex);
                    dfs.ExamineEdge        += new EdgeHandler(this.ExamineEdge);
                    dfs.TreeEdge           += new EdgeHandler(this.TreeEdge);
                    dfs.BackEdge           += new EdgeHandler(this.BackEdge);
                    dfs.ForwardOrCrossEdge += new EdgeHandler(this.FowardOrCrossEdge);
                    dfs.FinishVertex       += new VertexHandler(this.FinishVertex);

                    Parents.Clear();
                    DiscoverTimes.Clear();
                    FinishTimes.Clear();
                    m_Time = 0;

                    foreach (IVertex v in g.Vertices)
                    {
                        Parents[v] = v;
                    }

                    var choose = PexChoose.FromCall(this);
                    if (choose.ChooseValue <bool>("to add a self ede"))
                    {
                        IVertex selfEdge = RandomGraph.Vertex(g, rnd);
                        g.AddEdge(selfEdge, selfEdge);
                    }
                    // compute
                    dfs.Compute();

                    CheckDfs(g, dfs);
                }
            }
        }
        /// <inheritdoc />
        protected override void InternalCompute()
        {
            Debug.Assert(ComponentCount >= 0);
            Debug.Assert(VisitedGraph.VertexCount >= 0 || ComponentCount == 0);
            //Debug.Assert(VisitedGraph.Vertices.All(v => Components.ContainsKey(v)));
            //Debug.Assert(VisitedGraph.VertexCount == Components.Count);
            //Debug.Assert(Components.Values.All(c => c <= ComponentCount));

            ComponentsPerStep = new List <int>();
            VerticesPerStep   = new List <TVertex>();

            Components.Clear();
            Roots.Clear();
            DiscoverTimes.Clear();
            _stack.Clear();
            ComponentCount = 0;
            _dfsTime       = 0;

            DepthFirstSearchAlgorithm <TVertex, TEdge> dfs = null;

            try
            {
                dfs = new DepthFirstSearchAlgorithm <TVertex, TEdge>(
                    this,
                    VisitedGraph,
                    new Dictionary <TVertex, GraphColor>(VisitedGraph.VertexCount));
                dfs.DiscoverVertex += OnVertexDiscovered;
                dfs.FinishVertex   += OnVertexFinished;

                dfs.Compute();
            }
            finally
            {
                if (dfs != null)
                {
                    dfs.DiscoverVertex -= OnVertexDiscovered;
                    dfs.FinishVertex   -= OnVertexFinished;
                }
            }
        }