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