Niestety, nie byliśmy w stanie w pełni poprawnie wyświetlić tego pliku, ponieważ nie jest zakodowany w UTF-8.
Możesz pobrać ten plik i spróbować otworzyć go samodzielnie.
#include <cstdio> #include <list> long long int n, m, a, b; bool daSieZnalezc = false; long long int ilosc = 0; long long int const MAX = 500001LL; struct Node; struct Edge{ //krawedz z v->w int w; // Edge *rev; // wska?nik na kraw?d? wsteczn? Edge(int w_in){ w = w_in; } }; struct Vertex{ int x = 0; //numer wierzcholka // int bfs = 0; bool visited; Vertex(int x_in){ visited = false; x = x_in; } Vertex(){ visited = false; x = 0; } }; Vertex V[MAX+1]; std::list<Edge> E[MAX+1]; std::list<Edge> ET[MAX+1]; int czas_wyjscia[MAX+1]; int numcss = 0; int css[MAX+1]; int q = 1; void dfs(int v){ V[v].visited = true; for (std::list<Edge>::iterator j = E[v].begin(); j != E[v].end(); ++j) { if(!(V[j->w].visited)){ dfs(j->w); }else{ daSieZnalezc = true; } } czas_wyjscia[q]=v; q++; } void dfsT(int v, int nc){ V[v].visited = true; css[nc]++; for (std::list<Edge>::iterator j = ET[v].begin(); j != ET[v].end(); ++j) { if(!(V[j->w].visited)){ dfsT(j->w,nc); } } } int main(){ scanf("%lld %lld", &n, &m); for(int i = 1; i <= n; ++i){ V[i] = Vertex(i); } for(int i = 1; i <= m; ++i){ scanf("%d %d", &a, &b); E[a].push_back(Edge(b)); ET[b].push_back(Edge(a)); // E[a].back().rev = &E[b].back(); } //dfs pami�ta czasy wyjscia for(int i = 1; i <= n; ++i){ if(!V[i].visited){ dfs(i); } } //wyzeruj visited for(int i = 1; i <= n; ++i){ V[i].visited=false; } //dfs na odwrotnym grafie for(int i = 1; i <= n; ++i){ if(!V[czas_wyjscia[i]].visited){ numcss++; dfsT(i,numcss); } } //sprawdz czy wi�cej ni� jedna css int czy = 0; for(int i = 1; i <= numcss; ++i){ if(css[i] > 1){ if(czy == 0){ czy = 1; }else{ ilosc = 0; } } } if(!daSieZnalezc){ printf("NIE"); }else{ if(ilosc == 0){ printf("%lld", ilosc); }else{ printf("%lld", ilosc); //tutaj petla } } // printf("\n"); // for(int i = 1; i <= n; ++i){ // printf("i: %d ", i); // for (std::list<Edge>::iterator j = E[i].begin(); j != E[i].end(); ++j) { // printf("(%lld,%lld)",i, j->w); // } // } }
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 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | #include <cstdio> #include <list> long long int n, m, a, b; bool daSieZnalezc = false; long long int ilosc = 0; long long int const MAX = 500001LL; struct Node; struct Edge{ //krawedz z v->w int w; // Edge *rev; // wska?nik na kraw?d? wsteczn? Edge(int w_in){ w = w_in; } }; struct Vertex{ int x = 0; //numer wierzcholka // int bfs = 0; bool visited; Vertex(int x_in){ visited = false; x = x_in; } Vertex(){ visited = false; x = 0; } }; Vertex V[MAX+1]; std::list<Edge> E[MAX+1]; std::list<Edge> ET[MAX+1]; int czas_wyjscia[MAX+1]; int numcss = 0; int css[MAX+1]; int q = 1; void dfs(int v){ V[v].visited = true; for (std::list<Edge>::iterator j = E[v].begin(); j != E[v].end(); ++j) { if(!(V[j->w].visited)){ dfs(j->w); }else{ daSieZnalezc = true; } } czas_wyjscia[q]=v; q++; } void dfsT(int v, int nc){ V[v].visited = true; css[nc]++; for (std::list<Edge>::iterator j = ET[v].begin(); j != ET[v].end(); ++j) { if(!(V[j->w].visited)){ dfsT(j->w,nc); } } } int main(){ scanf("%lld %lld", &n, &m); for(int i = 1; i <= n; ++i){ V[i] = Vertex(i); } for(int i = 1; i <= m; ++i){ scanf("%d %d", &a, &b); E[a].push_back(Edge(b)); ET[b].push_back(Edge(a)); // E[a].back().rev = &E[b].back(); } //dfs pami�ta czasy wyjscia for(int i = 1; i <= n; ++i){ if(!V[i].visited){ dfs(i); } } //wyzeruj visited for(int i = 1; i <= n; ++i){ V[i].visited=false; } //dfs na odwrotnym grafie for(int i = 1; i <= n; ++i){ if(!V[czas_wyjscia[i]].visited){ numcss++; dfsT(i,numcss); } } //sprawdz czy wi�cej ni� jedna css int czy = 0; for(int i = 1; i <= numcss; ++i){ if(css[i] > 1){ if(czy == 0){ czy = 1; }else{ ilosc = 0; } } } if(!daSieZnalezc){ printf("NIE"); }else{ if(ilosc == 0){ printf("%lld", ilosc); }else{ printf("%lld", ilosc); //tutaj petla } } // printf("\n"); // for(int i = 1; i <= n; ++i){ // printf("i: %d ", i); // for (std::list<Edge>::iterator j = E[i].begin(); j != E[i].end(); ++j) { // printf("(%lld,%lld)",i, j->w); // } // } } |