sdut 2819 比赛排名(边表 拓扑排序)

题目:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2819

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <algorithm>
 6 using namespace std;
 7 const int maxn = 800+10;
 8 int t, head[maxn], cnt[maxn], a[maxn];
 9 
10 struct node
11 {
12     int u, v, next;
13 } g[maxn];
14 void init()
15 {
16     t = 0;
17     memset(head, -1, sizeof(head));
18     memset(cnt, 0, sizeof(cnt));
19 }
20 void add(int u, int v)
21 {
22     g[t].u = u;
23     g[t].v = v;
24     g[t].next = head[u];
25     head[u] = t;
26     t++;
27 }
28 void topo(int u)
29 {
30     int i;
31     for(i = head[u]; i != -1; i = g[i].next)
32     cnt[g[i].v]--;
33 }
34 int main()
35 {
36     int n, m, p1, p2, f;
37     int i, j, x;
38     while(~scanf("%d%d", &n, &m))
39     {
40         f = 0;
41         x = 1;
42         init();
43         while(m--)
44         {
45             scanf("%d%d", &p1, &p2);
46             add(p1, p2);  //有向边
47             cnt[p2]++;
48         }
49         for(i = 1; i <= n; i++)
50         {
51             for(j = 1; j <= n; j++)
52             {
53                 if(cnt[j]==0)
54                 {
55                     cnt[j] = -1;
56                     a[x++] = j;
57                     topo(j);  //拓扑排序,去掉入度
58                     break;
59                 }
60             }
61             if(j == n+1)  //如果没有入度为0的,说明不符合条件
62             {
63                 f = 1;
64                 break;
65             }
66         }
67         if(f)
68             printf("-1\n");
69         else
70         {
71             for(i = 1; i <= n; i++)
72                 if(i==n)
73                     printf("%d\n", a[i]);
74                 else
75                     printf("%d ", a[i]);
76         }
77     }
78     return 0;
79 }

 

posted @ 2014-03-05 00:00  水门  阅读(229)  评论(0编辑  收藏  举报