输入一个图,让你判断给定的序列是不是拓扑排序,
首先输入,然后定义两个vector,因为向量可以直接比较赋值,然后这里需要注意的是图的点是1到n,所以避免出错先压入一个0,然后就是输入序列开始进行判断,先看这个点的入度是不是0,因为拓扑排序的定义就是这样的, 排到你这个点的时候,已经没有任务在你的前面了,实际上这也是唯一的判断之处,然后将这个点后面连接的点入度减一,接着判断就行了,
#include <bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define all(x) (x).begin(), (x).end()
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef pair<int, int> pa;
int main() {
int n, m;
cin >> n >> m;
vi v[1005];
int indegree[1005] = {};
for (int i = 0; i < m; i++) {
int a, b;
cin >> a >> b;
v[a].pb(b);
indegree[b]++;
}
int k;
cin >> k;
vi v1, v2;
v1.pb(0);
for (int i = 1; i <= n; i++) {
v1.pb(indegree[i]);
}
v2 = v1;
int cnt = 0;
for (int i = 0; i < k; i++) {
int ok = 1;
v2 = v1;
for (int j = 0; j < n; j++) {
int x;
cin >> x;
if (v2[x]) {
ok = 0;
}
for (int t = 0; t < (int) v[x].size(); t++) {
v2[v[x][t]]--;
}
}
if (!ok) cout << (cnt++ ? " " : "") << i;
}
return 0;
}