给任务排序,紫书P167Uva10305

来源:互联网 发布:分类汇总数据复制出来 编辑:程序博客网 时间:2024/06/04 23:20

通过本题第一次学到拓扑排序的概念,以及dfs解决拓扑排序的方法。

// UVa10305 Ordering Tasks// Rujia Liu#include<cstdio>#include<cstring>const int maxn = 1000;int n, m, G[maxn][maxn], c[maxn], topo[maxn], t;bool dfs(int u){  c[u] = -1;  for(int v = 0; v < n; v++) if(G[u][v]) {    if(c[v]<0) return false;    else if(!c[v] && !dfs(v)) return false;  }  c[u] = 1; topo[--t]=u;  return true;}bool toposort(){  t = n;  memset(c, 0, sizeof(c));  for(int u = 0; u < n; u++) if(!c[u])    if(!dfs(u)) return false;  return true;}int main() {  while(scanf("%d%d", &n, &m) == 2 && n) {    memset(G, 0, sizeof(G));    for(int i = 0; i < m; i++) {      int u, v;      scanf("%d%d", &u, &v); u--; v--;      G[u][v] = 1;    }    if(toposort()) {      for(int i = 0; i < n-1; i++)        printf("%d ", topo[i]+1);      printf("%d\n", topo[n-1]+1);    }    else      printf("No\n");   }}

其中标记数组c是本题的关键,c[u] == 0:表示节点u未排序过,c[u] == -1表示u节点正在排序中,c[u] == 1表示u节点排序完了。而本题排序失败的条件就是该有向图存在环,放到程序中就是dfs过程中会回到正在访问的变量。也就是-1。
至于核心的dfs细节还是需要反复理解。

原创粉丝点击