题目描述
题目大意
给一个有向图,判断给定序列是否是拓扑序列。
分析
根据给定的序列对拓扑排序的过程进行模拟,如果模拟过程中当前顶点其入度不为0,那么就不是一个拓扑序列。
拓扑排序知识点:拓扑排序
AC代码
#include<iostream>
#include<cstring>
#include<string>
#include<vector>
#include<map>
#include<set>
#include<unordered_set>
#include<unordered_map>
#include<stack>
#include<queue>
#include<cmath>
#include<algorithm>
using namespace std;
vector<int> adj[1001];
int in[1001];
int main() {
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int n, m; cin >> n >> m;
while (m--) {
int a, b; scanf("%d%d", &a, &b);
adj[a].push_back(b);
in[b]++;
}
int k, t, flag=0; cin >> k;
for (int i = 0; i < k; i++) {
bool judge = 1;
vector<int> t_in(in, in + n + 1); //每次重新复制一遍是为了不改变in[]
for (int j = 0; j < n; j++) {
scanf("%d", &t);
if (t_in[t] != 0) judge = 0;
for (int it : adj[t]) t_in[it]--;
}
if (judge == 0) {
if (flag) printf(" ");
printf("%d", i);
flag = 1; //用于标记是否是第一个数
}
}
return 0;
}