传送门:题目
题意:
一个人要完成几门课程,但是有的课程有基础课程,要完成基础课程才行,问完成所有课程需要至少完成几门课程,并按照时间先后输出。
题解:
题目一看就是拓扑排序,随便一搞就行了。
AC代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <set>
#include <vector>
#define debug(x) cout<<#x<<" = "<<x<<endl;
#define INF 0x3f3f3f3f
using namespace std;
const int maxn = 1e5 + 10;
vector<int> ans;
vector<int> vec[maxn];
int flag[maxn];//0 no select 1 select 2 have selected
void dfs(int u) {
if(flag[u]==2)
return ;
flag[u]=1;
for (auto v : vec[u]) {
if (flag[v] == 1) {
puts("-1"), exit(0);
}
dfs(v);
}
flag[u]=2;
ans.push_back(u);
}
int main(void) {
int n, k, temp, v;
cin >> n >> k;
vector<int> need;
while (k--) {
cin >> temp;
need.push_back(temp);
}
for (int u = 1; u <= n; u++) {
cin >> temp;
while (temp--) {
cin >> v;
vec[u].push_back(v);
}
}
for (auto x : need)
dfs(x);
cout << ans.size() << endl;
for (auto x : ans)
cout << x << " ";
return 0;
}