PTA Topological Order (25分)

It is the human mind that releases infinite light, and it is also the human mind that creates boundless darkness. Light and darkness are intertwined and fight together. This is the world for which we are nostalgic and helpless.

This is a problem given in the Graduate Entrance Exam in 2018: Which of the following is NOT a topological order obtained from the given directed graph? Now you are supposed to write a program to test each of the options.

gre.jpg

Input Specification:

Each input file contains one test case. For each case, the first line gives two positive integers N (≤ 1,000), the number of vertices in the graph, and M (≤ 10,000), the number of directed edges. Then M lines follow, each gives the start and the end vertices of an edge. The vertices are numbered from 1 to N. After the graph, there is another positive integer K (≤ 100). Then K lines of query follow, each gives a permutation of all the vertices. All the numbers in a line are separated by a space.

Output Specification:

Print in a line all the indices of queries which correspond to "NOT a topological order". The indices start from zero. All the numbers are separated by a space, and there must no extra space at the beginning or the end of the line. It is graranteed that there is at least one answer.

Sample Input:

6 8
1 2
1 3
5 2
5 4
2 3
2 6
3 4
6 4
5
1 5 2 3 6 4
5 1 2 6 3 4
5 1 2 3 6 4
5 2 1 6 3 4
1 2 3 4 5 6

Sample Output:

3 4
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <vector>
#include <ctime>
#include <cctype>
#include <bitset>
#include <utility>
#include <sstream>
#include <complex>
#include <iomanip>
#include<climits>//INT_MAX

//#include<bits/stdc++.h>
#define PP pair<ll,int>
#define inf 0x3f3f3f3f
#define llinf 0x3f3f3f3f3f3f3f3fll
#define dinf 1000000000000.0
#define PI 3.1415926
typedef long long ll;
using namespace std;
int const mod=1e9+7;
const int maxn=1e5+10;
int mp[1001][1001];
vector<int> v1(1001,0);
vector<int> v2(1001,0);
vector<int> v;
int n,m,k;
void judge(int a){
	for(int i=1;i<=n;i++){
		if(mp[a][i]==1){
			v2[i]--;
		}
	}
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int a,b;
		cin>>a>>b;
		mp[a][b] = 1;
		v1[b]++;
	}
	cin>>k;
	int fg=0;
	for(int i=0;i<k;i++){
		int flag=0;
		for(int j=1;j<=n;j++)
			v2[j]=v1[j];
		for(int j=1;j<=n;j++){
			int a;
			cin>>a;
			if(v2[a]==0)
			 	judge(a);
			else{
				flag=1;
				fg++;
			}
		}
		if(flag)
			v.push_back(i);
	}
	for(int i=0;i<v.size();i++){
		if(i==0)
			cout<<v[i];
		else
			cout<<' '<<v[i];
	}
	cout<<endl;
	return 0;
}

 

Guess you like

Origin blog.csdn.net/weixin_44170305/article/details/108465918