题意:给定一个有向图,然后给定一些遍历顺序,判断是否不是拓扑排序;
思路:用一个数组保存每个节点的入读,然后用邻接表存储图,输入每个数,就判断该数的入度是否为0,如果为0,则修改每个其相邻的节点的入度即减1,否则,就认为不是拓扑排序;
代码:
#include<iostream>
#include<vector>
using namespace std;
int main() {
vector<int> p[1010];//邻接表存储表
int n, m, k, a, b,flag = 0,cnt = 0,in[1010] = {0};//存储每个节点的入度
cin >> n >> m;
for (int i = 0; i < m; i++) {
scanf("%d%d",&a,&b);
p[a].push_back(b);
in[b]++;
}
scanf("%d",&k);
for (int i = 0; i < k; i++) {
flag = 1;
vector<int> vin(in, in + n + 1);//把in数组从0+n+1复制到vin数组中去
for (int j = 0; j < n; j++) {//在输入数据的时候就判断
scanf("%d", &a);
if (vin[a] != 0)flag = 0;//考虑到要输入所有的数,没有break;
for (int it : p[a])vin[it]--;//a中每个孩子节点的入度减1
}
if (flag == 1)continue;//如果flag为1,则表明什么都不需要做
printf("%s%d",cnt==0?"":" ", i);
cnt++;
}
system("pause");
return 0;
}