Ejemplo n.º 1
0
        private void solve(IDirectedGraph g)
        {
            result = new List <int>();
            Degrees degrees_info = new Degrees(g);

            int[] degrees = new int[g.V];
            for (int i = 0; i < g.V; ++i)
            {
                degrees[i] = degrees_info.InDegree(i);
            }
            Queue <int> starts = new Queue <int>();

            foreach (Int32 s in degrees_info.Sources())
            {
                starts.Enqueue(s);
            }
            //只要还有顶点
            while (starts.Count > 0)
            {
                Int32 v = starts.Dequeue();
                result.Add(v);
                foreach (var w in g.Adj(v))
                {
                    //删除这个顶点的指出的边,因为这个顶点已经被删除了
                    --degrees[w];
                    if (degrees[w] == 0)
                    {
                        //下一个拓扑排序的顺序
                        starts.Enqueue(w);
                    }
                }
            }
        }
        private void solve(IDirectedGraph g)
        {
            // 度的信息
            int         count = 0;                                    // 顶点计数
            Stack <int> S = new Stack <int>(), T = new Stack <int>(); // 储存入度为0的点,拓扑顶点序列
            Degrees     degrees_info = new Degrees(g);

            int[] degrees = new int[g.V];
            for (int i = 0; i < g.V; ++i)
            {
                degrees[i] = degrees_info.InDegree(i);
                if (degrees[i] == 0)
                {
                    S.Push(i);
                }
            }
            while (S.Count > 0)
            {
                int v = S.Pop();
                T.Push(v); // 这个是起始
                ++count;
                foreach (var arc in g.GetEdge(v))
                {
                    // 遍历所有的边
                    int w = arc.Other(v);
                    if (--degrees[w] == 0)
                    {
                        S.Push(w);                      //下一个入点被钦定
                    }
                    if (m_ve[v] + arc.Weight > m_ve[w]) // 如果 w 可以尽量晚开始,那就
                    {
                        m_ve[w] = m_ve[v] + (int)arc.Weight;
                    }
                }
            }
            if (count >= g.V)
            {
                result = T;
            }
        }