题目链接:click here
思路:拓扑排序弱化版,甚至连拓扑序列都不用求,话说和拓扑排序相关的题目都很水啊。
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <vector>
#include <sstream>
#include <queue>
#include <climits>
using namespace std;
const int MAXN = 1005;
const int INF = INT_MAX;
int indegree[MAXN], indegreemirror[MAXN], N;
vector<int> graph[MAXN];
bool IsTuoPuSeq(vector<int> seq){
bool flag = true;
for(int i = 0; i < seq.size(); i++){
int from = seq[i], to;
if(indegreemirror[from] != 0) flag = false;
for(int j = 0; j < graph[from].size(); j++){
to = graph[from][j];
indegreemirror[to]--;
}
}
return flag;
}
void Initial(){
for(int i = 1; i <= N; i++){
graph[i].clear();
indegree[i] = 0;
}
}
int main(){
// freopen("in.txt", "r", stdin);
int M, K;
while(~scanf("%d %d", &N, &M)){
Initial();
int from, to, point;
for(int i = 0; i < M; i++){
scanf("%d %d", &from, &to);
graph[from].push_back(to);
indegree[to]++;
}
scanf("%d", &K);
vector<int> ans;
for(int i = 0; i < K; i++){
for(int j = 1; j <= N; j++){
indegreemirror[j] = indegree[j];
}
vector<int> seq;
for(int j = 0; j < N; j++){
scanf("%d", &point);
seq.push_back(point);
}
if(!IsTuoPuSeq(seq)) ans.push_back(i);
}
bool flag = false;
for(int i = 0; i < ans.size(); i++){
if(flag) printf(" ");
flag = true;
printf("%d", ans[i]);
}
printf("\n");
}
return 0;
}