c_pat_拓扑序列(减入度+注意输入坑)
第一行包含两个整数 N 和 M,分别表示有向图的点和边的数量。
接下来 M 行,每行给出一条边的起点和终点。
点的编号从 1 到 N。
再一行包含一个整数 K,表示询问次数。
接下来 K 行,每行包含一个所有点的排列。
一行中的数字用空格隔开。
输出格式
在一行中输出所有不是拓扑序列的询问序列的编号。
#include<bits/stdc++.h>
using namespace std;
const int N=1005, K=105;
vector<int> g[N];
int main() {
std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int n,m; cin>>n>>m;
vector<int> in(n+5,0);
for (int i=0; i<m; i++) {
int u,v; cin>>u>>v;
g[u].push_back(v);
in[v]++;
}
int k, is_firstTime=true; cin>>k;
for (int i=0; i<k; i++) {
bool is_topo=true;
vector<int> in1(in);
for (int j=0; j<n; j++) {
int u; cin>>u;
if (in1[u]!=0) {
is_topo=false; //不能提前break啊,还要输入数据...
}
for (int v : g[u]) in1[v]--;
}
if (!is_topo) {
if (is_firstTime) cout<<i, is_firstTime=false;
else cout<<' '<<i;
}
}
return 0;
}