uva10305-拓扑排序

来源:互联网 发布:双色球算法公式技巧 编辑:程序博客网 时间:2024/06/04 18:51

思路:用topo数组记录;用dfs终止环;状态标记:-1是正在访问,0是未访问,1是已经访问过了。

代码:

#include <bits/stdc++.h>using namespace std;typedef long long ll;const int maxn = 100 + 10;int c[maxn];int topo[maxn], t, G[maxn][maxn];int n,m;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] && !dfs(u))        return false;    }    return true;}int main(){    while(scanf("%d%d", &n, &m) && n+m) {        memset(G, 0 ,sizeof G);        int a, b;        for (int i=0; i<m; i++) {            scanf("%d%d", &a, &b);            G[a-1][b-1] = 1;        }       if( toposort()) {        for (int i=0; i<n; i++)            printf("%d ", topo[i]+1);        puts("");       }    }    return 0;}


0 0
原创粉丝点击