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))); }