/// <summary> /// Determines whether the edge-weighted digraph <c>G</c> has a /// topological order and, if so, finds such a topological order.</summary> /// <param name="G">the digraph</param> /// public TopologicalX(EdgeWeightedDigraph G) { // indegrees of remaining vertices int[] indegree = new int[G.V]; for (int v = 0; v < G.V; v++) { indegree[v] = G.Indegree(v); } // initialize rank = new int[G.V]; order = new LinkedQueue <int>(); int count = 0; // initialize queue to contain all vertices with indegree = 0 LinkedQueue <int> queue = new LinkedQueue <int>(); for (int v = 0; v < G.V; v++) { if (indegree[v] == 0) { queue.Enqueue(v); } } for (int j = 0; !queue.IsEmpty; j++) { int v = queue.Dequeue(); order.Enqueue(v); rank[v] = count++; foreach (DirectedEdge e in G.Adj(v)) { int w = e.To; indegree[w]--; if (indegree[w] == 0) { queue.Enqueue(w); } } } // there is a directed cycle in subgraph of vertices with indegree >= 1. if (count != G.V) { order = null; } Debug.Assert(check(G)); }
/// <summary> /// Initializes a new edge-weighted digraph that is a deep copy of <c>G</c>.</summary> /// <param name="G">the edge-weighted digraph to copy</param> /// public EdgeWeightedDigraph(EdgeWeightedDigraph G) : this(G.V) { numEdges = G.E; for (int v = 0; v < G.V; v++) { indegree[v] = G.Indegree(v); } for (int v = 0; v < G.V; v++) { // reverse so that adjacency list is in same order as original Stack <DirectedEdge> reverse = new Stack <DirectedEdge>(); foreach (DirectedEdge e in G.adj[v]) { reverse.Push(e); } foreach (DirectedEdge e in reverse) { adj[v].Add(e); } } }