Codeforces 909E. Coprocessor (拓扑、模拟)

题目链接: Coprocessor

题意:

  给出n个待处理的事件(0 - n-1),再给出了n个标(0表示只能在主处理器中处理这个事件,1表示只能在副处理器中处理这个事件),处理器每次能处理多个任务。每个事件有关联,如果一个任务要在副处理器上执行,那它所依赖的任务要么已执行完了,要么和它一起在这个副处理器上同时执行。问副处理器最少调用多少次。

题解:

  首先拓扑排序是肯定要的,先处理出入度为0的点,处理的时候先处理所有入度为0且标为0(只能在主处理器上处理)的点,这样保证每处理一次就把能在副处理器上处理的点全都处理了出来。在处理的过程中保存处理出来的入度为0的点,这样就不用暴力找点了。

 

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int MAX_N = 1e5+9;
 4 int res[MAX_N];
 5 vector<int> vec[MAX_N];
 6 int in[MAX_N];
 7 queue<int> que1,que2;
 8 int main()
 9 {
10     int N,M,T;
11     while(cin>>N>>M)
12     {
13         memset(res,0,sizeof(res));
14         memset(in,0,sizeof(in));
15         while(!que1.empty()) que1.pop();
16         while(!que2.empty()) que2.pop();
17         for(int i=0;i<MAX_N;i++) vec[i].clear();
18         for(int i=0;i<N;i++)
19         {
20             scanf("%d",&res[i]);
21         }
22         for(int i=0;i<M;i++)
23         {
24             int a,b;
25             scanf("%d%d",&a,&b);
26             vec[b].push_back(a);
27             in[a] ++;
28         }
29         for(int i=0;i<N;i++)
30         {
31             if(in[i] == 0)
32             {
33                 if(res[i] == 0) que1.push(i);
34                 else if(res[i] == 1) que2.push(i);
35             }
36 
37         }
38         int ans = 0;
39         int cnt = N;
40         while(cnt > 0)
41         {
42             while(!que1.empty())
43             {
44 
45                 int t = que1.front();que1.pop();
46                 cnt --;
47                 for(int i=0;i<vec[t].size();i++)
48                 {
49                     in[vec[t][i]]--;
50                     if(in[vec[t][i]] == 0)
51                     {
52                         if(res[vec[t][i]] == 1) que2.push(vec[t][i]);
53                         else que1.push(vec[t][i]);
54                     }
55                 }
56             }
57             if(!que2.empty()) ans ++;
58             while(!que2.empty())
59             {
60                 int t = que2.front();que2.pop();
61                 cnt --;
62                 for(int i=0;i<vec[t].size();i++)
63                 {
64                     in[vec[t][i]]--;
65                     if(in[vec[t][i]] == 0)
66                     {
67                         if(res[vec[t][i]] == 1) que2.push(vec[t][i]);
68                         else que1.push(vec[t][i]);
69                     }
70                 }
71             }
72         }
73         cout<<ans<<endl;
74     }
75     return 0;
76 }

 

posted @ 2018-01-31 12:22  会打架的程序员不是好客服  阅读(302)  评论(0编辑  收藏  举报