UVa 10305 Ordering Tasks【拓扑排序】

题意:给出n件事情,m个二元组关系,求它们的拓扑序列

 

用的队列来做

 1 #include<iostream>  
 2 #include<cstdio>  
 3 #include<cstring> 
 4 #include <cmath> 
 5 #include<stack>
 6 #include<vector>
 7 #include<map> 
 8 #include<set>
 9 #include<queue> 
10 #include<algorithm>  
11 using namespace std;
12 
13 #define foreach(i,c) for (__typeof(c.begin()) i = c.begin(); i != c.end(); ++i)
14 
15 typedef long long LL;
16 const int INF = (1<<30)-1;
17 const int mod=1000000007;
18 const int maxn=100005;
19 int ecnt;
20 int n,m;
21 
22 int g[1005][1005],in[1005],ans[maxn];
23 
24 void toposort(){
25     queue<int> q;
26     
27     for(int i=1;i<=n;i++)
28     if(in[i]==0) q.push(i);
29     
30     int cnt=0;
31     while(!q.empty()){
32         int tmp=q.front();q.pop();
33         ans[++cnt]=tmp;
34         
35         for(int j=1;j<=n;j++){
36             if(g[tmp][j]){
37                 in[j]--;
38                 if(in[j]==0) q.push(j);
39             }
40         }        
41     }
42     
43     printf("%d",ans[1]);
44     for(int i=2;i<=cnt;i++)
45     printf(" %d",ans[i]);    
46     printf("\n");
47 }
48 
49 
50 int main(){
51     while(scanf("%d %d",&n,&m)!=EOF){
52         if(n==0&&m==0) break;
53         
54         memset(g,0,sizeof(g));
55         memset(in,0,sizeof(in));
56         
57         while(m--){
58             int u,v;
59             cin>>u>>v;
60             g[u][v]=1;
61             in[v]++;
62         }
63         toposort();
64     }
65     return 0;        
66 }
View Code

 

posted @ 2015-04-25 15:18  sequenceaa  阅读(165)  评论(0编辑  收藏  举报