[PAT] A1146 Topological Order

tech2022-09-01  90

拓扑排序

题目大意

给出拓扑结构图和一些序列,判断哪些序列不是该图的拓扑排序结果。

思路

用邻接表G存储这个有向图,并将每个节点的入度保存在rudu数组中。对于每一个要判断的序列,依次遍历其结点,如果当前结点的入度不为0则表示不是拓扑序列,每次判断某个点后将它所指向的所有结点的入度-1。

AC代码

#define _CRT_SECURE_NO_WARNINGS #include<cstdio> #include<iostream> #include<vector> using namespace std; #define MAX 1002 vector<int>G[MAX], rudu, trudu, xulie, ans; int n; bool topo() { int flag = true; for (int i = 0;i < n;i++) { if (trudu[xulie[i]] != 0) { flag = false; break; } for (int j = 0;j < G[xulie[i]].size();j++) { int v = G[xulie[i]][j]; trudu[v] --; } } return flag; } int main() { int m, i, j, start, end, times; scanf("%d%d", &n, &m); rudu.resize(n + 1); trudu.resize(n + 1); xulie.resize(n); for (i = 0;i < m;i++) { scanf("%d%d", &start, &end); rudu[end]++; G[start].push_back(end); } scanf("%d", &times); bool flag = false; for (i = 0;i < times;i++) { for (j = 0;j < n;j++)scanf("%d", &xulie[j]); trudu = rudu; if (!topo()) ans.push_back(i); } for (i = 0;i < ans.size();i++) { if (i == 0) printf("%d", ans[i]); else printf(" %d", ans[i]); } return 0; }
最新回复(0)