Codeforces 770C 拓扑排序 DFS

传送门:题目

题意:

一个人要完成几门课程,但是有的课程有基础课程,要完成基础课程才行,问完成所有课程需要至少完成几门课程,并按照时间先后输出。

题解:

题目一看就是拓扑排序,随便一搞就行了。

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;
}
    原文作者:拓扑排序
    原文地址: https://blog.csdn.net/shadandeajian/article/details/82156923
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞