ACM2647拓扑排序逆运算

2647题是对工人排序问题,不是从头到尾排序,而是从尾到头排序;

代码中用到vector和queue容器,权当练习。

用广搜进行拓扑排序的逆运算。

 1 #include<iostream>
 2 #include<vector>
 3 #include<queue>
 4 #include<cstring>
 5 using namespace std;
 6 const int maxn=10010;
 7 int main()
 8 {
 9     int n,m;
10     int sum[maxn];
11     int out[maxn];
12     while(cin>>n>>m)
13     {
14         int a,b;
15         vector<int>next[maxn];
16         queue<int>q;
17         memset(sum,0,sizeof(sum));
18         memset(out,0,sizeof(out));
19         for(int i=0;i<m;i++)
20         {
21             cin>>a>>b;
22             next[b].push_back(a);
23             out[a]++;
24         }
25         for(int i=1;i<=n;i++)
26         {
27             if(out[i]==0)
28             {
29                 q.push(i);
30                 sum[i]=888;
31             }
32         }
33         if(q.empty())
34         {
35             cout<<-1<<endl;
36             continue;
37         }
38         int cnt=n;
39         while(!q.empty())
40         {
41             int v=q.front();
42             q.pop();
43             cnt--;
44             for(int i=0;i<next[v].size();i++)
45             {
46                 out[next[v][i]]--;
47                 if(out[next[v][i]]==0)
48                 {
49                     q.push(next[v][i]);
50                     sum[next[v][i]]=sum[v]+1;
51                 }
52             }
53         }
54         if(cnt>0)
55         {
56             cout<<-1<<endl;
57             continue;
58         }
59         int ans=0;
60         for(int i=1;i<=n;i++)
61         {
62             ans+=sum[i];
63         }
64         cout<<ans<<endl;
65     }
66     return 0;
67 }
What I don't dare to say is I can't!
原文地址:https://www.cnblogs.com/sytu/p/3877252.html