TopologicalSort.cpp 585 B

1234567891011121314151617181920212223
  1. //
  2. struct edge { int v, next; };
  3. bool TopSortDFS(int v, edge e[], int g[], int u[], int &m) {
  4. u[v] = -2;
  5. for(int i = g[v]; i != -1; i=e[i].next)
  6. if(u[e[i].v]==-2)
  7. return false;
  8. else if(u[e[i].v]==-1 && !TopSortDFS(e[i].v, e, g, u, m))
  9. return false;
  10. u[v] = --m;
  11. return true;
  12. }
  13. bool TopSort(edge e[], int g[], int n, int list[]) {
  14. static int u[maxn];
  15. int m = n;
  16. memset(u, 255, sizeof(u));
  17. for(int i = 0; i < n; i++)
  18. if(u[i] == -1 && !TopSortDFS(i,e,g,u,m))
  19. return false;
  20. for(int i = 0; i < n; i++)
  21. list[u[i]] = i;
  22. return true;
  23. }