private static Vertex[] CreateDirectedAcyclicGraph(int n)
        {
            Vertex[] vertices = new Vertex[n];

            for (int i = 0; i < vertices.Length; i++)
            {
                vertices[i] = new Vertex();
            }

            for (int i = 0; i < vertices.Length; i++)
            {
                for (int j = 0; j < i; j++)
                {
                    vertices[i].AddUnDirectedEdge(vertices[j]);
                }
            }

            while (!TopologicalSortTestClass.IsDirectedAcyclicGraph(vertices))
            {
                TopologicalSortTestClass.RemoveRandomEdge(vertices);
            }

            foreach (Vertex v in vertices)
            {
                v.Reset();
            }

            return(vertices);
        }
        private static bool IsDirectedAcyclicGraph(Vertex[] vertices)
        {
            foreach (Vertex v in vertices)
            {
                v.Reset();
            }

            return(!vertices.Any(v => TopologicalSortTestClass.HasCycle(v)));
        }
        public void TopologicalSortTest()
        {
            for (int n = 0; n < 5; n++)
            {
                Vertex[] vertices = TopologicalSortTestClass.CreateDirectedAcyclicGraph(n);
                Vertex[] order    = TopologicalSort.Run(vertices);

                for (int i = n - 1; i >= 0; i--)
                {
                    foreach (Vertex v in vertices)
                    {
                        v.Reset();
                    }

                    DepthFirstSearch.Run(order[i]);
                    for (int j = 0; j < i; j++)
                    {
                        Assert.AreEqual(Color.White, order[j].Color);
                    }
                }
            }
        }
        private static bool HasCycle(Vertex vertex)
        {
            if (vertex.Color == Color.Gray)
            {
                return(true);
            }

            if (vertex.Color == Color.Black)
            {
                return(false);
            }

            vertex.Color = Color.Gray;

            if (vertex.Vertices.Any(v => TopologicalSortTestClass.HasCycle(v)))
            {
                return(true);
            }

            vertex.Color = Color.Black;

            return(false);
        }