#include<iostream> #include<vector> #define MAXN 500003 using namespace std; vector<int> V[MAXN]; vector<int> wazne; int odw[MAXN]; int a,b,n,m,sasiad; bool jest; /* bool dfs(int pocz){ odw[pocz] = 1; for(int i = 0; i < V[pocz].size(); i++){ sasiad = V[pocz][i]; if(odw[sasiad] == 1)return true; else dfs(sasiad); } }*/ void dfs2(int pocz){ odw[pocz] = 1; for(int i = 0; i < V[pocz].size(); i++){ sasiad = V[pocz][i]; if(odw[sasiad] == 1){ jest = 1; return; } else if(odw[sasiad] == 0)dfs2(sasiad); } odw[pocz] = 2; } bool sprawdz_cykl(){ for(int i = 1; i <= n; i++){ if(odw[i] == 0){ dfs2(i); if(jest == 1)return true; } } return false; } void wyczysc(){ for(int i = 1; i <= n; i++)odw[i] = 0; } int main(){ ios_base::sync_with_stdio(0); cin >> n >> m; for(int i = 0; i < m; i++){ cin >> a >> b; V[a].push_back(b); } //1. sprawdz, czy w ogole jest jakis cykl: if(!sprawdz_cykl()){ cout << "NIE" << endl; } else{ //2. dla kazdego wierzcholka sprawdz, czy bez niego nadal istnieje jakis cykl for(int i = 1; i <= n; i++){ wyczysc(); jest = 0; odw[i] = 2; for(int j = 1; j <= n; j++){ if(odw[j] == 0){ dfs2(j); if(jest == 1)break; } } if(jest == 0)wazne.push_back(i); } cout << wazne.size() << endl; for(int i = 0; i < wazne.size(); i++){ cout<<wazne[i]<<" "; } cout << endl; } 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 93 94 95 96 97 98 | #include<iostream> #include<vector> #define MAXN 500003 using namespace std; vector<int> V[MAXN]; vector<int> wazne; int odw[MAXN]; int a,b,n,m,sasiad; bool jest; /* bool dfs(int pocz){ odw[pocz] = 1; for(int i = 0; i < V[pocz].size(); i++){ sasiad = V[pocz][i]; if(odw[sasiad] == 1)return true; else dfs(sasiad); } }*/ void dfs2(int pocz){ odw[pocz] = 1; for(int i = 0; i < V[pocz].size(); i++){ sasiad = V[pocz][i]; if(odw[sasiad] == 1){ jest = 1; return; } else if(odw[sasiad] == 0)dfs2(sasiad); } odw[pocz] = 2; } bool sprawdz_cykl(){ for(int i = 1; i <= n; i++){ if(odw[i] == 0){ dfs2(i); if(jest == 1)return true; } } return false; } void wyczysc(){ for(int i = 1; i <= n; i++)odw[i] = 0; } int main(){ ios_base::sync_with_stdio(0); cin >> n >> m; for(int i = 0; i < m; i++){ cin >> a >> b; V[a].push_back(b); } //1. sprawdz, czy w ogole jest jakis cykl: if(!sprawdz_cykl()){ cout << "NIE" << endl; } else{ //2. dla kazdego wierzcholka sprawdz, czy bez niego nadal istnieje jakis cykl for(int i = 1; i <= n; i++){ wyczysc(); jest = 0; odw[i] = 2; for(int j = 1; j <= n; j++){ if(odw[j] == 0){ dfs2(j); if(jest == 1)break; } } if(jest == 0)wazne.push_back(i); } cout << wazne.size() << endl; for(int i = 0; i < wazne.size(); i++){ cout<<wazne[i]<<" "; } cout << endl; } return 0; } |