拓扑排序 按答案顺序判断入度就可以了
#include <cstdio>
#include <algorithm>
#include <math.h>
#include <string.h>
#include <vector>
#include <iostream>
#define ll long long
#define INF 0x3f3f3f
using namespace std;
const int N=1000+100;
vector<int> v[N];
int in[N],in1[N];
int ans[11111];
int main()
{
int n,m,i,j,k,cnt,to,uu,vv,x,flag,kk;
cnt=1;
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++)
{
scanf("%d%d",&uu,&vv);
in1[vv]++;
v[uu].push_back(vv);
}
scanf("%d",&kk);
for(i=1;i<=kk;i++)
{
flag=0;
for(j=1;j<=n;j++)
in[j]=in1[j];
for(j=1;j<=n;j++)
{
scanf("%d",&x);
if(in[x]>0)
{
flag=1;
continue;
}
else
{
for(k=0;k<v[x].size();k++)
{
to=v[x][k];
in[to]--;
}
}
}
if(flag) ans[cnt++]=i-1;
}
printf("%d",ans[1]);
for(i=2;i<cnt;i++) printf(" %d",ans[i]);
printf("\n");
return 0;
}