PAT A1146 Topological Order
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
- 用一个数组de[]记录每个节点的入度,输入的同时随便记录下来
- 每轮查询,用另一个数组作为de的副本
- 先判断当前输入节点是否入度为0,为0则输入合法,将由他出发达到的顶点入度–(在副本中操作)
- 若当前输入节点入度不为0,输入不合法,用vector记录查询的组号(这一组的后续数据也要处理完,不能提前break,要用一个锁关闭进vector的入口)
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn = 1010;
const int INF = 0x3fffffff;
int v, e, v1, v2, nq, tmpin;
vector<int> ans, G[maxn], de(maxn), deu(maxn);
int main(){
scanf("%d %d", &v, &e);
for(int i = 0; i < e; ++i){
scanf("%d %d", &v1, &v2);
G[v1].push_back(v2);
de[v2]++;
}
scanf("%d", &nq);
for(int i = 0; i < nq; ++i){
deu = de;
bool lock = true;
for(int j = 0; j < v; ++j){
scanf("%d", &tmpin);
if(deu[tmpin] == 0){
for(int j = 0; j < G[tmpin].size(); ++j){
int next = G[tmpin][j];
deu[next]--;
}
}else if(lock){
ans.push_back(i);
lock = false;
}
}
}
for(int i = 0; i < ans.size(); ++i){
if(i == 0) printf("%d", ans[i]);
else printf(" %d", ans[i]);
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1010;
vector<int> G[maxn], degree(maxn), ans;
int main(){
int nv, ne, nq;
scanf("%d %d", &nv, &ne);
for(int i = 0; i < ne; ++i){
int v1, v2;
scanf("%d %d", &v1, &v2);
G[v1].push_back(v2);
degree[v2]++;
}
scanf("%d", &nq);
int num_v;
for(int i = 0; i < nq; ++i){
vector<int> d = degree;
bool flg = true;
for(int j = 0; j < nv; ++j){
int tmp;
scanf("%d", &tmp);
if(d[tmp] == 0){
for(auto it : G[tmp]){
d[it]--;
}
}else if(flg){
ans.push_back(i);
flg = false;
}
}
}
for(int i = 0; i < ans.size(); ++i){
if(i == 0) printf("%d", ans[i]);
else printf(" %d", ans[i]);
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1010;
vector<int> G[maxn];
int main()
{
int n, m;
scanf("%d %d", &n, &m);
vector<int> degree(n+1), test;
for(int i = 0; i < m; ++i)
{
int v1, v2;
scanf("%d %d", &v1, &v2);
G[v1].push_back(v2);
degree[v2]++;
}
int nq, cnt = 0;
scanf("%d", &nq);
for(int i = 0; i < nq; ++i)
{
test = degree;
bool flg = true;
for(int j = 0; j < n; ++j)
{
int tmp;
scanf("%d", &tmp);
if(flg)
{
if(test[tmp] != 0)
{
if(cnt++ == 0) printf("%d", i);
else printf(" %d", i);
flg = false;
}else
{
for(int k = 0; k < G[tmp].size(); ++k)
{
int nex = G[tmp][k];
test[nex]--;
}
}
}
}
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1010;
vector<int> G[maxn], ind, test;
int main()
{
int n, m;
scanf("%d %d", &n, &m);
ind.resize(n+1);
for(int i = 0; i < m; ++i)
{
int v1, v2;
scanf("%d %d", &v1, &v2);
G[v1].push_back(v2);
ind[v2]++;
}
int nq;
bool first = true;
scanf("%d", &nq);
for(int i = 0; i < nq; ++i)
{
test = ind;
bool lock = true;
for(int j = 0; j < n; ++j)
{
int tmp;
scanf("%d", &tmp);
if(lock)
{
if(test[tmp] == 0)
{
for(int l = 0; l < G[tmp].size(); ++l)
{
int nex = G[tmp][l];
test[nex]--;
}
}else
{
if(first)
{
printf("%d", i);
first = false;
}else printf(" %d", i);
lock = false;
}
}
}
}
return 0;
}