A1146
Description:
给出有向图及序列,判断该序列是否为拓扑序列;
思路:
- 根据拓扑序列构造方法,检查序列依次出栈的节点入度是否为零即可;
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<vector>
#include<queue>
using namespace std;
const int maxn = 1e3+5;
const int maxm = 1e4+5;
struct Node{
int d; //入度,当该点为终点时+1
vector<int>to; //该节点指向的节点下标
}node[maxn];
int n, m, k;
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif // ONLINE_JUDGE
scanf("%d%d", &n ,&m);
int u, v;
for(int i = 0; i < m; i++){
scanf("%d%d", &u, &v);
node[u].to.push_back(v); //将终点加入当前节点指向节点序列
node[v].d++; //终点的入度++
}
bool flag = false; //用于标记是否为首个输出的元素,false为首个元素
int du[maxn], t; //du数组用于复制所有节点的入度信息
scanf("%d", &k);
for(int i = 0 ; i < k ; i++){
for(int j = 1; j <= n; j++){
du[j] = node[j].d; //每次问询拷贝入读信息
}
bool istpo = true; //初始化当前为拓扑序列
for(int j = 0; j < n; j++){
scanf("%d", &t);
if(istpo){
if(du[t]!=0) istpo = false;
else for(auto it:node[t].to){
du[it]--;
}
}
}
if(!istpo){ //非拓扑序列
if(!flag) flag = true; //首次输出
else printf(" ");
printf("%d", i);
}
}
return 0;
}