两个队列的拓扑排序
#include <iostream>
#include <cstdio>
#include <cmath>
#include <vector>
#include <algorithm>
#include <cstring>
#include <string>
#include <queue>
using namespace std;
int n,m;
int e[100005];
vector<int> vec[100005];
int in[100005];
int main() {
while(~scanf("%d%d",&n,&m))
{
memset(in,0,sizeof(in));
for(int i=0;i<=100000;i++)
vec[i].clear();
for(int i=0;i<n;i++)
{
scanf("%d",&e[i]);
}
for(int i=0;i<m;i++)
{
int t1,t2;
scanf("%d%d",&t1,&t2);
vec[t2].push_back(t1);
in[t1]++;
}
queue<int> q1,q2;
for(int i=0;i<n;i++)
{
if(in[i]==0)
{
if(e[i]==0)
{
q1.push(i);
} else
{
q2.push(i);
}
}
}
int ans=0;
while(!(q1.empty() && q2.empty()))
{
while(!q1.empty())
{
int cur=q1.front();
q1.pop();
int len=vec[cur].size();
for(int i=0;i<len;i++)
{
int v=vec[cur][i];
in[v]--;
if(in[v]==0)
{
if(e[v]==0)
q1.push(v);
else
q2.push(v);
}
}
}
if(!q2.empty())
ans++;
while(!q2.empty())
{
int cur=q2.front();
q2.pop();
int len=vec[cur].size();
for(int i=0;i<len;i++)
{
int v=vec[cur][i];
in[v]--;
if(in[v]==0)
{
if(e[v]==0)
q1.push(v);
else
q2.push(v);
}
}
}
}
printf("%d\n",ans);
}
return 0;
}