Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <set>
- #include <algorithm>
- #define forn(i, n) for(int i = 1; i <= n; ++i)
- #define MAX 100002
- using namespace std;
- vector<set<int>>graph(MAX);
- vector<int>oto;
- vector<int> ans;
- int mark[MAX];
- int n, m;
- bool dfs(int v) {
- if (mark[v] != 0) return 0;
- mark[v] = 1;
- for( int x : graph[v]) {
- dfs(x);
- if (mark[x] == 1)
- return 1;
- }
- oto.push_back(v);
- mark[v] = 2;
- return false;
- }
- void top_sort() {
- forn(i, n)
- mark[i] = 0;
- oto.clear();
- forn(i, n)
- if(!mark[i]) {
- if (dfs(i) == 1) {
- cout << "NO" << "\n";
- return;
- }
- }
- reverse(oto.begin(), oto.end());
- for(int i: oto) {
- if (*graph[i].find(i + 1)) {
- ans.push_back(i);
- for (int i: ans)
- cout << i << " ";
- return;
- } else
- {
- cout << "NO" << "\n";
- return;
- }
- }
- }
- int main() {
- ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
- cin >> n >> m;
- int u, v;
- forn(i, m) {
- cin >> v >> u;
- graph[v].insert(u);
- }
- top_sort();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement