private readonly Edge[] _edgeTo;   // edgeTo[v] = last edge on longest s->v path.

        public AcyclicLongestPath(EdgeWeightedDigraph graph, Int32 vertice)
        {
            this._distTo = new Double[graph.VerticesCount];
            this._edgeTo = new Edge[graph.VerticesCount];

            for (int i = 0; i < graph.VerticesCount; i++)
            {
                this._distTo[i] = Double.NegativeInfinity;
            }

            this._distTo[vertice] = 0.0;

            TopologicalChecker topological = TopologicalChecker.Create(graph);

            if (topological.Order == null)
            {
                throw new InvalidOperationException("Digraph is not acyclic.");
            }

            foreach (Int32 v in topological.Order)
            {
                foreach (Edge edge in graph.GetAdjacentVertices(v))
                {
                    this.Relax(edge);
                }
            }
        }
        public void Test_IsDAG_EdgeWeighted()
        {
            EdgeWeightedDigraph graph = new EdgeWeightedDigraph(3);

            graph.AddEdge(new Edge(0, 1, 0.2));
            graph.AddEdge(new Edge(0, 2, 0.3));

            TopologicalChecker checker = TopologicalChecker.Create(graph);

            Assert.True(checker.IsDAG);
        }
        public void Test_IsDAG()
        {
            Digraph graph = new Digraph(3);

            graph.AddEdge(0, 1);
            graph.AddEdge(0, 2);

            TopologicalChecker checker = TopologicalChecker.Create(graph);

            Assert.True(checker.IsDAG);
        }
        public void Test_Rank()
        {
            Digraph graph = new Digraph(4);

            graph.AddEdge(0, 1);
            graph.AddEdge(0, 2);
            graph.AddEdge(2, 3);

            TopologicalChecker checker = TopologicalChecker.Create(graph);

            Assert.Equal(1, checker.Rank(1));
        }
        public void Test_Order()
        {
            Digraph graph = new Digraph(4);

            graph.AddEdge(0, 1);
            graph.AddEdge(0, 2);
            graph.AddEdge(2, 3);

            TopologicalChecker checker = TopologicalChecker.Create(graph);

            AssertUtilities.Sequence(new Int32[4] {
                0, 1, 2, 3
            }, checker.Order);
        }