#include <cstdio> #include <vector> #include <set> int n,m; std::vector<int> e[500000]; int odl[500000], root[500000], odw[500000], prev[500000]; int a,b,liczba_odw, liczba_wynikow; std::set<int> wyn, nowy; bool pierwszy = true; void DFS(int v, int codl) { // printf("Visit %d\n", v); if (!pierwszy && wyn.size() == 0) { return; } if (!odw[v]) { liczba_odw++; } odl[v] = codl-1; odw[v] = 1; for (auto i : e[v]) { if (!pierwszy && wyn.size() == 0) { break; } if (odw[i] == 1) { int from = v; if (pierwszy) { // printf("Pierwszy %d ", i); pierwszy = false; wyn.insert(i); while(from != i) { // printf("%d ", from); wyn.insert(from); from=prev[from]; } } else { // printf("Znajdłem cykl %d ", i); nowy.clear(); if (wyn.find(i) != wyn.end()) { nowy.insert(i); } while (from != i) { // printf("%d", from); if (wyn.find(from) != wyn.end()) { // putchar('.'); nowy.insert(from); // } else { // putchar(' '); } from = prev[from]; } std::swap(nowy, wyn); } // printf("\nwyn: "); // for (auto i : wyn) { // printf("%d ", i); // } // printf("\n"); } else if (odw[i] == 0) { prev[i] = v; root[i] = root[v]; DFS(i, codl+1); } else if (odw[i] == 2 && root[i] == root[v]) { if (odl[i] >= codl) { prev[i] = v; DFS(i, codl+1); } } } odw[v] = 2; } int main() { scanf("%d%d", &n, &m); for (int i = 0; i < m; i++) { scanf("%d%d", &a, &b); e[a-1].push_back(b-1); } for (int i = 0; i < n && liczba_odw < n && (pierwszy || wyn.size() > 0) ; i++) { if (!odw[i]) { root[i] = i; DFS(i, 1); } } if (pierwszy) { printf("NIE\n"); return 0; } printf("%lu\n", wyn.size()); for (auto i : wyn) { printf("%d ", i+1); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | #include <cstdio> #include <vector> #include <set> int n,m; std::vector<int> e[500000]; int odl[500000], root[500000], odw[500000], prev[500000]; int a,b,liczba_odw, liczba_wynikow; std::set<int> wyn, nowy; bool pierwszy = true; void DFS(int v, int codl) { // printf("Visit %d\n", v); if (!pierwszy && wyn.size() == 0) { return; } if (!odw[v]) { liczba_odw++; } odl[v] = codl-1; odw[v] = 1; for (auto i : e[v]) { if (!pierwszy && wyn.size() == 0) { break; } if (odw[i] == 1) { int from = v; if (pierwszy) { // printf("Pierwszy %d ", i); pierwszy = false; wyn.insert(i); while(from != i) { // printf("%d ", from); wyn.insert(from); from=prev[from]; } } else { // printf("Znajdłem cykl %d ", i); nowy.clear(); if (wyn.find(i) != wyn.end()) { nowy.insert(i); } while (from != i) { // printf("%d", from); if (wyn.find(from) != wyn.end()) { // putchar('.'); nowy.insert(from); // } else { // putchar(' '); } from = prev[from]; } std::swap(nowy, wyn); } // printf("\nwyn: "); // for (auto i : wyn) { // printf("%d ", i); // } // printf("\n"); } else if (odw[i] == 0) { prev[i] = v; root[i] = root[v]; DFS(i, codl+1); } else if (odw[i] == 2 && root[i] == root[v]) { if (odl[i] >= codl) { prev[i] = v; DFS(i, codl+1); } } } odw[v] = 2; } int main() { scanf("%d%d", &n, &m); for (int i = 0; i < m; i++) { scanf("%d%d", &a, &b); e[a-1].push_back(b-1); } for (int i = 0; i < n && liczba_odw < n && (pierwszy || wyn.size() > 0) ; i++) { if (!odw[i]) { root[i] = i; DFS(i, 1); } } if (pierwszy) { printf("NIE\n"); return 0; } printf("%lu\n", wyn.size()); for (auto i : wyn) { printf("%d ", i+1); } } |