[HDU] 1285 确定比赛名次(拓扑排序)

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1285

拓扑排序模板题

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<string.h>
 4 #include<algorithm>
 5 #include<math.h>
 6 #include<stdbool.h>
 7 #include<time.h>
 8 #include<stdlib.h>
 9 #include<set>
10 #include<map>
11 #include<stack>
12 #include<queue>
13 #include<vector>
14 using namespace std;
15 #define clr(x,y)    memset(x,y,sizeof(x))
16 #define sqr(x)      ((x)*(x))
17 #define rep(i,a,b)  for(int i=(a);i<=(b);i++)
18 #define LL          long long
19 #define INF         0x3f3f3f3f
20 #define A           first
21 #define B           second
22 
23 int cnt,num,n,m,head[600],d[600],a[600];
24 
25 struct node
26 {
27     int u,v,w;
28     int next;
29 } edge[10000];
30 
31 void init()
32 {
33     clr(head,-1);
34     clr(a,0);
35     clr(d,0);
36     cnt=0;
37     num=0;
38 }
39 
40 void add(int u,int v,int w)
41 {
42     edge[cnt].v=v;
43     edge[cnt].w=w;
44     edge[cnt].next=head[u];
45     head[u]=cnt++;
46 }
47 
48 void tops()
49 {
50     int u;
51     for(int i=0;i<n;i++) {
52         for(int j=1;j<=n;j++) {
53             if(!d[j]) {
54                 u=j;
55                 d[j]--;
56                 a[num++]=j;
57                 break;    
58             }
59         }
60         for(int j=head[u];j!=-1;j=edge[j].next) {
61             d[edge[j].v]--;
62         }
63     }
64     
65     for(int i=0;i<num;i++) {
66         if(i!=num-1) printf("%d ",a[i]);
67         else         printf("%d\n",a[i]);
68     }
69 }
70 
71 int main()
72 {
73     int x,y;
74     
75     while(~scanf("%d%d",&n,&m)) {
76         init();
77         while(m--){
78             scanf("%d%d",&x,&y);
79             add(x,y,1);
80             d[y]++;
81         }
82        
83         tops();
84     }
85     
86     return 0;
87 }

 

posted @ 2015-03-23 17:40  SXISZERO  阅读(193)  评论(0编辑  收藏  举报