#include <bits/stdc++.h> using namespace std; #define int long long vector<int>v[500001]; int vtd[500001]; int cyklbeg[500001]; int wyn[500001]; vector<int>out; bool t[500001]; long long cykle; //wszystkie cykle long long liczc; //cykle w serii struct cross{ long long ilc; int nr; cross(long long _ilc, int _nr){ ilc = _ilc; nr = _nr; } }; stack<cross>S; void DFS(int x, int nn){ vtd[x] = nn; t[x] = 1; S.push(cross(liczc, x)); for(int i = 0; i < v[x].size(); i++){ if(vtd[v[x][i]] == 0){ //idziemy dalej DFS(v[x][i], nn); } else if(vtd[v[x][i]] == nn && t[v[x][i]] == 1){ //spotykamy cykl cyklbeg[v[x][i]] -= 1; liczc++; cykle++; } } t[x] = 0; wyn[x] = liczc - S.top().ilc; liczc += cyklbeg[x]; S.pop(); } #undef int int main(){ //ios_base::sync_with_stdio(0); #define int long long int n, m; //cin >> n >> m; scanf("%lld%lld", &n, &m); for(int i = 0; i < m; i++){ int a, b; //cin >> a >> b; scanf("%lld%lld", &a, &b); v[a].push_back(b); } int num = 1; for(int i = 1; i <= n; i++){ if(vtd[i] == 0){ liczc = 0; DFS(i, num); num++; } } if(cykle == 0){ //cout << "NIE" << endl; printf("NIE"); } else{ for(int i = 1; i <= n; i++){ if(wyn[i] == cykle){ out.push_back(i); } } //cout << out.size() << endl; printf("%d\n", out.size()); for(int i = 0; i < out.size(); i++){ //cout << out[i] << " "; printf("%lld ", out[i]); } printf("\n"); } 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 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 <bits/stdc++.h> using namespace std; #define int long long vector<int>v[500001]; int vtd[500001]; int cyklbeg[500001]; int wyn[500001]; vector<int>out; bool t[500001]; long long cykle; //wszystkie cykle long long liczc; //cykle w serii struct cross{ long long ilc; int nr; cross(long long _ilc, int _nr){ ilc = _ilc; nr = _nr; } }; stack<cross>S; void DFS(int x, int nn){ vtd[x] = nn; t[x] = 1; S.push(cross(liczc, x)); for(int i = 0; i < v[x].size(); i++){ if(vtd[v[x][i]] == 0){ //idziemy dalej DFS(v[x][i], nn); } else if(vtd[v[x][i]] == nn && t[v[x][i]] == 1){ //spotykamy cykl cyklbeg[v[x][i]] -= 1; liczc++; cykle++; } } t[x] = 0; wyn[x] = liczc - S.top().ilc; liczc += cyklbeg[x]; S.pop(); } #undef int int main(){ //ios_base::sync_with_stdio(0); #define int long long int n, m; //cin >> n >> m; scanf("%lld%lld", &n, &m); for(int i = 0; i < m; i++){ int a, b; //cin >> a >> b; scanf("%lld%lld", &a, &b); v[a].push_back(b); } int num = 1; for(int i = 1; i <= n; i++){ if(vtd[i] == 0){ liczc = 0; DFS(i, num); num++; } } if(cykle == 0){ //cout << "NIE" << endl; printf("NIE"); } else{ for(int i = 1; i <= n; i++){ if(wyn[i] == cykle){ out.push_back(i); } } //cout << out.size() << endl; printf("%d\n", out.size()); for(int i = 0; i < out.size(); i++){ //cout << out[i] << " "; printf("%lld ", out[i]); } printf("\n"); } return 0; } |