题目大意
这是2018年研究生入学考试中给出的一个问题:以下哪个不是从给定的有向图中获得的拓扑顺序?现在您应该编写一个程序来测试每个选项。
解题思路
- 首先使用邻接表表示图
- 使用数组表示每一个节点的入度
- 入度为0的点符合拓扑排序
代码
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n, m, a, b, k, flag = 0, in[1010];
vector<int> v[1010];
scanf("%d %d", &n, &m);
for (int i = 0; i < m; i++) {
scanf("%d %d", &a, &b);
v[a].push_back(b);
in[b]++;
}
scanf("%d", &k);
for (int i = 0; i < k; i++) {
int judge = 1;
vector<int> tin(in, in+n+1);
for (int j = 0; j < n; j++) {
scanf("%d", &a);
if (tin[a] != 0) judge = 0;
for (int it : v[a]) tin[it]--;
}
if (judge == 1) continue;
printf("%s%d", flag == 1 ? " ": "", i);
flag = 1;
}
return 0;
}