题意略。
思路:一个拓扑排序的题目吧。肯定是要先处理后面那个任务,再处理前面那个任务,我的思路是尽力先把主处理器能操作的先操作完,然后再把副处理器能操作完的再操作完,这样循环,直到处理完全部。
定义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 ",ans); return 0; }