来自拓扑第一天的痛苦 拓扑顺序1639
#include<bits/stdc++.h>
using namespace std;
const int N = 1010, M = 10010;
int h[N], ne[M], e[M], idx;
int n, m, k;
int oo[N],d[N],f[N]; //复制的入度oo==d 询问的点f 入度d
void add(int a, int b)
{
e[idx]=b, ne[idx]=h[a], h[a]=idx++;
}
bool topsort()
{
for(int i=1;i<=n;i++){
cin>>f[i];//气死我了这里输入和下面输入决定了bug!!
oo[i]=d[i];//便于操作
}
for(int i=1;i<=n;i++)
{
if(oo[f[i]])return false;//入度不为0就是错的
//第一个元素入度不为0 if (d[a[0]]) return false;
for(int j = h[f[i]]; ~j; j = ne[j])oo[e[j]]--;////当前元素入度-1
}
return true;//入度都为0才是对的
}
int main()
{
cin>>n>>m;
memset(h,-1,sizeof h);
for (int i=1;i<=m;++i)
{
int a, b;
cin>>a>>b;
add(a,b); //b节点入度加1
d[b]++;
}
cin>>k;
// for(int i=1;i<=n;i++)cin>>f[i];
// for(int i=1;i<=k;i++)if(topsort())cout<<i<<' ';
for(int i = 0; i < k; i++)if(!topsort())cout << i <<" ";
//尼玛的询问从0开始 我好像大概理解topsort为错时输出i?!
return 0;
}