CodeForces 909E

题意略。

思路:一个拓扑排序的题目吧。肯定是要先处理后面那个任务,再处理前面那个任务,我的思路是尽力先把主处理器能操作的先操作完,然后再把副处理器能操作完的再操作完,这样循环,直到处理完全部。

定义total变量为已经处理完的任务总数。

详见代码:

#include<bits/stdc++.h>
#define maxn 100005
using namespace std;

int mark[maxn],indegree[maxn];
vector<int> graph[maxn];
int N,M;
queue<int> que[2];

int main(){
    scanf("%d%d",&N,&M);
    for(int i = 0;i < N;++i) scanf("%d",&mark[i]);
    int u,v;
    for(int i = 0;i < M;++i){
        scanf("%d%d",&u,&v);
        graph[v].push_back(u);
        indegree[u] += 1;
    }
    int ans = 0;
    int total = N;
    for(int i = 0;i < N;++i){
        if(indegree[i] == 0){
            que[mark[i]].push(i);
        }
    }
    while(total > 0){
        while(que[0].size()){
            int temp = que[0].front();
            que[0].pop();
            total -= 1;
            for(int i = 0;i < graph[temp].size();++i){
                int nxt = graph[temp][i];
                indegree[nxt] -= 1;
                if(indegree[nxt] == 0)
                    que[mark[nxt]].push(nxt);
            }
        }
        if(total == 0) break;
        ans += 1;
        while(que[1].size()){
            int temp = que[1].front();
            que[1].pop();
            total -= 1;
            for(int i = 0;i < graph[temp].size();++i){
                int nxt = graph[temp][i];
                indegree[nxt] -= 1;
                if(indegree[nxt] == 0)
                    que[mark[nxt]].push(nxt);
            }
        }
    }
    if(que[1].size()) ans += 1;
    printf("%d\n",ans);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/tiberius/p/9259882.html