private static void Visit(IVertex node, ColorsSet colors,
                                  TimestampSet discovery, TimestampSet finish, LinkedList list, ref int time)
        {
            colors.Set(node, VertexColor.Gray);

            discovery.Register(node, time++);

            foreach (IVertex child in node.Adjacencies)
            {
                if (colors.ColorOf(child) == VertexColor.White)
                {
                    Visit(child, colors, discovery, finish, list, ref time);
                }
            }

            finish.Register(node, time++);

#if DEBUG
            System.Diagnostics.Debug.Assert(discovery.TimeOf(node) < finish.TimeOf(node));
#endif

            list.AddFirst(node);

            colors.Set(node, VertexColor.Black);
        }
        public static IVertex[] Sort(IVertex[] graphNodes)
        {
            ColorsSet    colors    = new ColorsSet(graphNodes);
            TimestampSet discovery = new TimestampSet();
            TimestampSet finish    = new TimestampSet();
            LinkedList   list      = new LinkedList();

            int time = 0;

            foreach (IVertex node in graphNodes)
            {
                if (colors.ColorOf(node) == VertexColor.White)
                {
                    Visit(node, colors, discovery, finish, list, ref time);
                }
            }

            return((IVertex[])list.ToArray(typeof(IVertex)));
        }