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