Example #1
0
        /// <summary>
        /// Critical path analysis algorithm
        /// </summary>
        /// <param name="g"></param>
        /// <returns></returns>
        public static IDigraph CriticalPathAnalysis(IDigraph g)
        {
            //TODO: more info here
            int i = g.NumberOfVertices;

            int[] nums1 = new int[(uint)i];
            nums1[0] = 0;
            g.TopologicalOrderTraversal(new EarliestTimeVisitor(nums1));
            int[] nums2 = new int[(uint)i];
            nums2[i - 1] = nums1[i - 1];
            g.DepthFirstTraversal(new PostOrder(new LatestTimeVisitor(nums2)), 0);
            IDigraph digraph1 = new DigraphAsLists(i);

            for (int j = 0; j < i; j++)
            {
                digraph1.AddVertex(j);
            }
            IEnumerator iEnumerator = g.Edges.GetEnumerator();

            try
            {
                while (iEnumerator.MoveNext())
                {
                    IEdge edge = (IEdge)iEnumerator.Current;
                    int   k    = nums2[edge.V1.Number] - nums1[edge.V0.Number] - (int)edge.Weight;
                    digraph1.AddConnection(edge.V0.Number, edge.V1.Number, (int)edge.Weight);
                }
            }
            finally
            {
                IDisposable iDisposable = iEnumerator as IDisposable;
                if (iDisposable != null)
                {
                    iDisposable.Dispose();
                }
            }
            return(DijkstrasAlgorithm(digraph1, 0));
        }