UVa 10305 Ordering Tasks (拓扑排序)

对一个有向无环图(DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序的序列,简称拓扑序列。
简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。

我用的是dfs实现的。

简单的说一下实现过程。
循环判断每个数是否有排序过,没有的话进行排序。
递归的方式找到没有比X更大的数,把X作为最后一个,以此类推;

具体实现代码如下:

   
     
  1. #include<cstdio>
  2. #include<cstring>
  3. const int MAXN = 1000;
  4. int n, m, G[MAXN][MAXN], c[MAXN], topo[MAXN], t;
  5. void dfs(int v) {
  6. c[v] = 1;
  7. for (int i = 0; i != n; ++i)
  8. if (G[v][i] && c[i] == 0) dfs(i);
  9. topo[--t] = v;
  10. }
  11. int main() {
  12. while (scanf("%d%d", &n, &m) == 2 && n) {
  13. for (int i = 0; i != m; ++i) {
  14. int v, u;
  15. scanf("%d%d", &v, &u);
  16. G[--v][--u] = 1;
  17. }
  18. t = n;
  19. memset(c, 0, sizeof(c));
  20. for (int i = 0; i != n; ++i)
  21. if (c[i] == 0) dfs(i);
  22. for (int i = 0; i != n - 1; ++i)
  23. printf("%d ", topo[i] + 1);
  24. printf("%d\n", topo[n - 1] + 1);
  25. }
  26. return 0;
  27. }





你可能感兴趣的:(order)