题意略。
思路:一个拓扑排序的题目吧。肯定是要先处理后面那个任务,再处理前面那个任务,我的思路是尽力先把主处理器能操作的先操作完,然后再把副处理器能操作完的再操作完,这样循环,直到处理完全部。
定义total变量为已经处理完的任务总数。
详见代码:
#include
#define maxn 100005
using namespace std;
int mark[maxn],indegree[maxn];
vector
int N,M;
queue
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 ;
}
手机扫一扫
移动阅读更方便
你可能感兴趣的文章