Browse Source

change topological sort

Olivier Marty 8 years ago
parent
commit
ab543b9927
1 changed files with 22 additions and 22 deletions
  1. 22 22
      code/TopologicalSort.cpp

+ 22 - 22
code/TopologicalSort.cpp

@@ -1,23 +1,23 @@
-//
-struct edge { int v, next; };
-bool TopSortDFS(int v, edge e[], int g[], int u[], int &m) {
-  u[v] = -2;
-  for(int i = g[v]; i != -1; i=e[i].next)
-    if(u[e[i].v]==-2)
-      return false;
-    else if(u[e[i].v]==-1 && !TopSortDFS(e[i].v, e, g, u, m))
-      return false;
-    u[v] = --m;
-    return true;
-}
-bool TopSort(edge e[], int g[], int n, int list[]) {
-  static int u[maxn];
-  int m = n;
-  memset(u, 255, sizeof(u));
-  for(int i = 0; i < n; i++)
-    if(u[i] == -1 && !TopSortDFS(i,e,g,u,m))
-      return false;
-  for(int i = 0; i < n; i++)
-    list[u[i]] = i;
-  return true;
+const int SIZE = 5000;
+int deg[SIZE];
+int ord[SIZE]; // ord start with 1
+void TopSort(vector<int> G[], int n) {
+    memset(deg, 0, sizeof(deg));
+    memset(ord, 0, sizeof(ord));
+    fin(i, n) for(int j : G[i]) deg[j]++;
+    queue<int> Q;
+    fin(i, n) if(!deg[i]) {
+            Q.push(i);
+            ord[i] = 1;
+        }
+    while(!Q.empty()) {
+        int i = Q.front(); Q.pop();
+        for(int j : G[i]) {
+            deg[j]--;
+            if(!deg[j]) {
+                Q.push(j);
+                ord[j] = ord[i] + 1;
+            }
+        }
+    }
 }