CodeForces 909E
阅读原文时间:2023年07月10日阅读:1

题意略。

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

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

详见代码:

#include
#define maxn 100005
using namespace std;

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

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

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章