PAT甲级——A1146 TopologicalOrder25

Posted zzw1024

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PAT甲级——A1146 TopologicalOrder25相关的知识,希望对你有一定的参考价值。

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.

技术图片

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

Solution:
  使用邻接矩阵来保存这个有向矩阵,并且把每个节点的入度计算,遍历判断的序列,每经过一个节点就判断该节点入度是不是为0,若不是,说明不是拓扑序列
每经过一个节点,将其指向节点的入度-1,表明指向节点的父节点遍历完毕,从而保证了整个序列是个拓扑序列
 1 #include <iostream>
 2 #include <vector>
 3 #include <queue>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 
 8 int main()
 9 {    
10     int n, m, k;
11     cin >> n >> m;
12     vector<vector<int>>v(n + 1);
13     vector<int>in(n + 1, 0), temp, res;//节点的入度
14     for (int i = 0; i < m; ++i)
15     {
16         int a, b;
17         cin >> a >> b;
18         v[a].push_back(b);
19         in[b]++;
20     }
21     cin >> k;
22     for (int i = 0; i < k; ++i)
23     {
24         bool flag = true;
25         temp = in;        
26         for (int j = 0; j < n; ++j)
27         {
28             int x;
29             cin >> x;
30             if (temp[x] != 0)flag = false;
31             for (auto a : v[x])--temp[a];//出现一次入度减一
32         }
33         if (!flag)
34             res.push_back(i);
35     }
36     for (int i = 0; i < res.size(); ++i)
37         cout << (i == 0 ? "" : " ") << res[i];    
38     return 0;
39 }

 

以上是关于PAT甲级——A1146 TopologicalOrder25的主要内容,如果未能解决你的问题,请参考以下文章

pat甲级没做出来没有分吗

pat甲级60分啥水平

pat可以直接考甲级吗

pat甲级考试+pat1051+1056

PAT甲级——A1025 PAT Ranking

菜鸟记录PAT甲级1003--Emergency