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.
  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);
//		}
//	}
	
}