http://codeforces.com/problemset/problem/909/E
由于分了两个queue,所以push的时候可以统一操作,不会影响彼此。两个queue相当于是平等的,只是q[1]加入计数。
虽然一开始自己也是拓扑序做的,但是一些细节操作浪费了时间TLE了。
比如我用了vis数组来判断终止态,其实只要判断pop点的个数就好
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<vector>
#include<queue>
#define IO ios::sync_with_stdio(false);cin.tie(0);
const int MOD=1e9+;
typedef int ll;
using namespace std;
vector<int> vec[];
int n, m, indegree[], cnt=, num=, vis[];
int a[], x, y, tail=-;
queue<int> q[];
void topo()
{
for(int i = ; i < n; i++){
if(!indegree[i]){
q[a[i]].push(i);
}
}
while(num<n){
if(!q[].empty())
while(!q[].empty()){
int t = q[].front();
q[].pop();
num++;
tail=t;
for(int i = ; i < vec[t].size(); i++){
indegree[vec[t][i]]--;
if(!indegree[vec[t][i]]){
q[a[vec[t][i]]].push(vec[t][i]);
}
}
}
if(!q[].empty()){
cnt++;
while(!q[].empty()){
int t = q[].front();
q[].pop();
num++;
tail=t;
for(int i = ; i < vec[t].size(); i++){
indegree[vec[t][i]]--;
if(!indegree[vec[t][i]]){
q[a[vec[t][i]]].push(vec[t][i]);
}
}
}
}
}
}
int main()
{
IO;
memset(vis, , sizeof(vis));
cin >> n >> m;
for(int i = ; i < n; i++){
cin >> a[i];
}
for(int i = ; i < m; i++){
cin >> x >> y; //x<-y
vec[y].push_back(x);
indegree[x]++;
}
topo();
cout << cnt << endl;
return ;
}