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