UVa 10305

UVa 10305

拓扑排序
虽然AC了,但还是觉得自己很不在状态.

 1 #include < stdio.h >
 2 #include < string .h >
 3 bool  G[ 110 ][ 110 ];
 4 int   in [ 110 ], m, n;
 5 struct  stack {
 6    int q[110], t;
 7    stack() {memset(q, 0sizeof(q)); t= 0;}
 8    void push(int x) {q[++t] = x;}
 9    int pop() {return q[t--];}
10    bool empty() {return t ? 0 : 1;}
11}
;
12 void  toposort() {
13    stack s;
14    int p[110], t = 0, i, j;
15    bool flag[110= {0};
16    for (;;){
17        if (t == m) break;
18        for (i = 1; i <= m; i++)
19            if (!in[i] && !flag[i]) s.push(i);
20        while (!s.empty()){
21            i = s.pop();
22            p[++t] = i; 
23            flag[i] = 1;
24            for (j = 1; j <= m; j++)
25                if (G[i][j]) in[j]--;
26        }

27    }

28    for (i = 1; i < t; i++)
29        printf("%d ", p[i]);
30    printf("%d\n", p[t]);
31}

32 int  main() {
33    int i, x, y; 
34    while (scanf("%d%d"&m, &n) == 2 && (m || n)){
35        memset(G, 0sizeof(G));
36        memset(in0sizeof(in));
37        for (i = 1; i <= n; i++){
38            scanf("%d%d"&x, &y);
39            G[x][y] = 1;
40            in[y]++;
41        }

42        toposort();
43    }

44}

45

你可能感兴趣的:(UVa 10305)