///<summary>
        /// Random graph generator for sparse graphs.
        ///</summary>
        private void GenerateSparseGraph(Graph G)
        {
            G.Clear();
            var index = new Dictionary <Node, int>();

            int n = NodeCount;

            int m = Math.Min(GetMaxEdges(), EdgeCount);

            Node[] V = new Node[n];

            for (int i = 0; i < n; i++)
            {
                V[i]        = G.CreateNode();
                index[V[i]] = i;
            }

            RandomSupport.Permutate(random, V);

            int count = m;

            while (count > 0)
            {
                int  vi = random.Next(n);
                Node v  = V[vi];
                Node w  = V[random.Next(n)];

                if (G.ContainsEdge(v, w) || (v == w && (!AllowSelfLoops || !AllowCycles)))
                {
                    continue;
                }
                G.CreateEdge(v, w);
                count--;
            }

            if (!AllowCycles)
            {
                foreach (Edge edge in G.Edges)
                {
                    if (index[edge.Source] > index[edge.Target])
                    {
                        G.ChangeEdge(edge, edge.Target, edge.Source);
                    }
                }
            }
        }
        ///<summary>
        /// Random graph generator for dense graphs.
        ///</summary>
        private void GenerateDenseGraph(Graph g)
        {
            g.Clear();
            Node[] nodes = new Node[NodeCount];

            for (int i = 0; i < NodeCount; i++)
            {
                nodes[i] = g.CreateNode();
            }

            RandomSupport.Permutate(random, nodes);

            int m = Math.Min(GetMaxEdges(), EdgeCount);
            int n = NodeCount;

            int adder = (AllowSelfLoops && AllowCycles) ? 0 : 1;

            bool[] edgeWanted = RandomSupport.GetBoolArray(random, GetMaxEdges(), m);
            for (int i = 0, k = 0; i < n; i++)
            {
                for (int j = i + adder; j < n; j++, k++)
                {
                    if (edgeWanted[k])
                    {
                        if (AllowCycles && random.NextDouble() > 0.5f)
                        {
                            g.CreateEdge(nodes[j], nodes[i]);
                        }
                        else
                        {
                            g.CreateEdge(nodes[i], nodes[j]);
                        }
                    }
                }
            }
        }