#include<iostream> #include<stdio.h> #include<stdlib.h> #include<math.h> #include<string.h> #include<algorithm> #include<map> #include<vector> #include<queue> using namespace std; //如果当前的结点入度≠0则不是拓扑序列,如果为0则将它能到达的结点的入度-1 //一定要注意多个for循环的循环变量i不能写混乱,可以为i、ii、iii int main(){ int n,m;//点数n 边数m vector<int> v[1010]; scanf("%d %d",&n,&m); int in[1000+1]={0}; int a,b; //用邻接表保存这个图 for(int i=0;i<m;i++){ scanf("%d %d",&a,&b); v[a].push_back(b);//a指向b结点 in[b]++;//b结点的入度+1 } int k; scanf("%d",&k);//k次查询 bool space=false;//是否输出空格 for(int i=0;i<k;i++){ int A[1010]; for(int ii=0;ii<n;ii++) scanf("%d",&A[ii]);//读入一次查询的拓扑序列 vector<int>temp(in,in+n+1); for(int iii=0;iii<n;iii++) if(temp[A[iii]]!=0){//当前入度不为0,则非拓扑序列 printf("%s%d",space?" ":"",i); space=true; break; }else{//入度为0 for(int j:v[A[iii]])//遍历能到达的结点并将入度-1 --temp[j]; } } system("pause"); return 0; }