#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); } } |
English