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; } }