示例#1
0
        /// <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));
        }
示例#2
0
 /// <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);
         }
     }
 }