uva 10305 ordering tasks(超级烂题)——yhx

 1 #include<cstdio>
 2 #include<cstring> 
 3 #include<stack>
 4 using namespace std;
 5 int first[110],next[10010],to[10010],n;
 6 bool b[110];
 7 stack<int> sta;
 8 void dfs(int p)
 9 {
10     int i,j,k,x,y,z;
11     for (i=first[p];i;i=next[i])
12       if (!b[to[i]]) dfs(to[i]);
13     b[p]=1;
14     sta.push(p);
15 }
16 void st()
17 {
18     int i,j,k,p,q,x,y,z;
19     memset(b,0,sizeof(b));
20     for (i=1;i<=n;i++)
21       if (!b[i]) dfs(i);
22 }
23 int main()
24 {
25     int m,i,j,k,x,y;
26     while (scanf("%d%d",&n,&m)&&(n||m))
27     {
28         memset(first,0,sizeof(first));
29         memset(next,0,sizeof(next));
30         memset(to,0,sizeof(to));
31         for (i=1;i<=m;i++)
32         {
33             scanf("%d%d",&x,&y);
34             next[i]=first[x];
35             first[x]=i;
36             to[i]=y;
37         }
38         st();
39         printf("%d",sta.top());
40         sta.pop();
41         while (!sta.empty())
42         {
43             printf(" %d",sta.top());
44             sta.pop();
45         }
46         printf("\n");
47     }
48     
49 }

 

拓扑排序,在每个没有访问过的点DFS。之后入栈。

为什么说是个烂题呢?题上没有说m的范围,所以m=0的时候不代表输入结束,不能写while (scanf()&&n&&m)。

你可能感兴趣的:(uva 10305 ordering tasks(超级烂题)——yhx)