题目
这道题目考察拓扑排序的原理,最近准备甲级考试,忽然发现缺了拓扑排序这一块内容,昨天晚上补了一下,做这道题目的时候还是想着板子,今天大致看了一下别人的思路,自己敲出来了。其实就是对于每次询问,判断每个点的入度是否为0,如果为0,将该点指向的下一结点的入度减1。边遍历边进行这样的操作,判断n个点是否全部点的入度为0。希望明天甲级考试顺利愉快!!!
#include <bits/stdc++.h>
using namespace std;
const int N=1100;
vector<int> G[N], ans;
int n, m, inDegree[N], aray[N];
int main()
{
memset(inDegree, 0, sizeof inDegree);
scanf("%d%d", &n, &m);
int a, b;
while(m--){
scanf("%d%d", &a, &b);
inDegree[b]+=1;
G[a].push_back(b);
}
int q;
scanf("%d", &q);
for(int i=0; i<q; i++){
bool flag=true;
for(int j=1; j<=n; j++){
aray[j]=inDegree[j];
}
for(int j=0; j<n; j++){
scanf("%d", &a);
if(aray[a]==0){
for(int k=0; k<(int)G[a].size(); k++){
int u=G[a][k];
aray[u]-=1;
}
} else {
flag=false;
}
}
if(!flag){
ans.push_back(i);
}
}
int len=(int)ans.size();
for(int i=0; i<len; i++){
printf("%d", ans[i]);
if(i!=len-1){
printf(" ");
} else {
printf("\n");
}
}
return 0;
}