#include <iostream> #include <vector> using namespace std; int liczba_cykli = 0, czesc_wspolna_wielkosc = 0, czesc_wspolna_start = -1; vector<int> stan_wierzcholkow(0, -1); bool exited = false; vector<int> dalej(0); vector<int> czesc_wspolna_dalej(0); void dfs(int v, vector< vector<int> > &G){ //cout <<"DFS przed przetworzeniem wierzcholka "<< v << endl; //for(int i = 1; i < stan_wierzcholkow.size(); i++) // cout << stan_wierzcholkow[i]<<" "; //cout<<endl; //cout <<"liczba cyki i czesc wspolna: "<< liczba_cykli <<" " <<czesc_wspolna_wielkosc<<endl; //int a; //cin >> a; if(stan_wierzcholkow[v] >= 0){ int u = dalej[v]; int czesc_wspolna_wczesniej; if(stan_wierzcholkow[v] == liczba_cykli){ czesc_wspolna_wielkosc = 1; czesc_wspolna_start = v; czesc_wspolna_wczesniej = v; } else czesc_wspolna_wielkosc = 0; stan_wierzcholkow[v]++; while(u != v){ if(stan_wierzcholkow[u] == liczba_cykli){ if(czesc_wspolna_wielkosc == 0) czesc_wspolna_start = u; czesc_wspolna_dalej[czesc_wspolna_wczesniej] = u; czesc_wspolna_wczesniej = u; stan_wierzcholkow[u]++; czesc_wspolna_wielkosc++; } u = dalej[u]; } liczba_cykli++; if(czesc_wspolna_wielkosc == 0){ exited = true; } return; } else stan_wierzcholkow[v] = 0; for(int l = 0; l < G[v].size(); l++) if(stan_wierzcholkow[G[v][l]] > -2){ dalej[v] = G[v][l]; dfs(G[v][l], G); if(exited) return; } if(stan_wierzcholkow[v] <=0) stan_wierzcholkow[v] = -2; } int main(){ ios_base::sync_with_stdio(0); int a, b, n, m; cin >> n >> m; vector< vector<int> >G(n+1, vector<int>(0)); for(int i =0; i < m; i++){ cin >> a >> b; G[a].push_back(b); } czesc_wspolna_dalej.resize(n+1, -1); dalej.resize(n+1, -1); stan_wierzcholkow.resize(n+1, -1); //for(int i =1 ;i <=n; i++) // cout << stan_wierzcholkow[i] <<" "; for(int i = 1; i <= n; i++) if(stan_wierzcholkow[i] == -1) dfs(i, G); if(liczba_cykli == 0) cout << "NIE"; else{ cout << czesc_wspolna_wielkosc<< endl; vector<bool> wynik(n+1, false); for(int i = 0; i < czesc_wspolna_wielkosc; i++){ wynik[czesc_wspolna_start] = true; czesc_wspolna_start = czesc_wspolna_dalej[czesc_wspolna_start]; } for(int i = 1; i <= n+1; ++i) if(wynik[i]) cout << i << " "; } }
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 <iostream> #include <vector> using namespace std; int liczba_cykli = 0, czesc_wspolna_wielkosc = 0, czesc_wspolna_start = -1; vector<int> stan_wierzcholkow(0, -1); bool exited = false; vector<int> dalej(0); vector<int> czesc_wspolna_dalej(0); void dfs(int v, vector< vector<int> > &G){ //cout <<"DFS przed przetworzeniem wierzcholka "<< v << endl; //for(int i = 1; i < stan_wierzcholkow.size(); i++) // cout << stan_wierzcholkow[i]<<" "; //cout<<endl; //cout <<"liczba cyki i czesc wspolna: "<< liczba_cykli <<" " <<czesc_wspolna_wielkosc<<endl; //int a; //cin >> a; if(stan_wierzcholkow[v] >= 0){ int u = dalej[v]; int czesc_wspolna_wczesniej; if(stan_wierzcholkow[v] == liczba_cykli){ czesc_wspolna_wielkosc = 1; czesc_wspolna_start = v; czesc_wspolna_wczesniej = v; } else czesc_wspolna_wielkosc = 0; stan_wierzcholkow[v]++; while(u != v){ if(stan_wierzcholkow[u] == liczba_cykli){ if(czesc_wspolna_wielkosc == 0) czesc_wspolna_start = u; czesc_wspolna_dalej[czesc_wspolna_wczesniej] = u; czesc_wspolna_wczesniej = u; stan_wierzcholkow[u]++; czesc_wspolna_wielkosc++; } u = dalej[u]; } liczba_cykli++; if(czesc_wspolna_wielkosc == 0){ exited = true; } return; } else stan_wierzcholkow[v] = 0; for(int l = 0; l < G[v].size(); l++) if(stan_wierzcholkow[G[v][l]] > -2){ dalej[v] = G[v][l]; dfs(G[v][l], G); if(exited) return; } if(stan_wierzcholkow[v] <=0) stan_wierzcholkow[v] = -2; } int main(){ ios_base::sync_with_stdio(0); int a, b, n, m; cin >> n >> m; vector< vector<int> >G(n+1, vector<int>(0)); for(int i =0; i < m; i++){ cin >> a >> b; G[a].push_back(b); } czesc_wspolna_dalej.resize(n+1, -1); dalej.resize(n+1, -1); stan_wierzcholkow.resize(n+1, -1); //for(int i =1 ;i <=n; i++) // cout << stan_wierzcholkow[i] <<" "; for(int i = 1; i <= n; i++) if(stan_wierzcholkow[i] == -1) dfs(i, G); if(liczba_cykli == 0) cout << "NIE"; else{ cout << czesc_wspolna_wielkosc<< endl; vector<bool> wynik(n+1, false); for(int i = 0; i < czesc_wspolna_wielkosc; i++){ wynik[czesc_wspolna_start] = true; czesc_wspolna_start = czesc_wspolna_dalej[czesc_wspolna_start]; } for(int i = 1; i <= n+1; ++i) if(wynik[i]) cout << i << " "; } } |