#include <cstdio>
#include <vector>
using namespace std;
vector<int> w[500001], sciecha, gut;
bool odw[500001], bad, cykl;
int n, m, a, b, lvl[500001], akt;
void dfsuj(int a) {
odw[a] = 1;
sciecha.push_back(a);
for (int i = 0; i < w[a].size(); i++) {
if (odw[w[a][i]] == 1) {
if (sciecha.size() > lvl[w[a][i]]) {
if (sciecha[lvl[w[a][i]]] == w[a][i] and w[a][i] != akt)
bad = 1;
if (sciecha[lvl[w[a][i]]] == w[a][i])
cykl = 1;
}
} else {
lvl[w[a][i]] = lvl[a] + 1;
dfsuj(w[a][i]);
}
}
sciecha.pop_back();
return;
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= m; i++) {
scanf("%d%d", &a, &b);
w[a].push_back(b);
}
for (int i = 1; i <= n; i++) {
cykl = 0;
bad = 0;
akt = i;
dfsuj(akt);
if (bad != 1) {
for (int j = 1; j <= n; j++) {
if (bad == 1)
break;
if (odw[j] == 0)
dfsuj(j);
}
}
if (bad == 0 and cykl == 1)
gut.push_back(i);
for (int j = 1; j <= n; j++) {
lvl[j] = 0;
odw[j] = 0;
}
}
if (gut.size() == 0) {
printf("NIE");
return 0;
}
printf("%d\n", gut.size());
for (int i = 0; i < gut.size(); i++)
printf("%d ", gut[i]);
return 0;
}
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 | #include <cstdio> #include <vector> using namespace std; vector<int> w[500001], sciecha, gut; bool odw[500001], bad, cykl; int n, m, a, b, lvl[500001], akt; void dfsuj(int a) { odw[a] = 1; sciecha.push_back(a); for (int i = 0; i < w[a].size(); i++) { if (odw[w[a][i]] == 1) { if (sciecha.size() > lvl[w[a][i]]) { if (sciecha[lvl[w[a][i]]] == w[a][i] and w[a][i] != akt) bad = 1; if (sciecha[lvl[w[a][i]]] == w[a][i]) cykl = 1; } } else { lvl[w[a][i]] = lvl[a] + 1; dfsuj(w[a][i]); } } sciecha.pop_back(); return; } int main() { scanf("%d%d", &n, &m); for (int i = 1; i <= m; i++) { scanf("%d%d", &a, &b); w[a].push_back(b); } for (int i = 1; i <= n; i++) { cykl = 0; bad = 0; akt = i; dfsuj(akt); if (bad != 1) { for (int j = 1; j <= n; j++) { if (bad == 1) break; if (odw[j] == 0) dfsuj(j); } } if (bad == 0 and cykl == 1) gut.push_back(i); for (int j = 1; j <= n; j++) { lvl[j] = 0; odw[j] = 0; } } if (gut.size() == 0) { printf("NIE"); return 0; } printf("%d\n", gut.size()); for (int i = 0; i < gut.size(); i++) printf("%d ", gut[i]); return 0; } |
English