有空多打几遍,多熟悉一下。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 10010;
const int maxm = 50010;
int n, m;
int _first[maxn], _next[maxm], _to[maxm], _cnt;
int out[maxn], num[maxm], belong[maxm], _num;
int Time, dfn[maxn], low[maxn];
stack <int> s1;
bool ins[maxn];
void add(int a, int b){
_next[++_cnt] = _first[a];
_first[a] = _cnt;
_to[_cnt] = b;
}
void tarjan(int now){
dfn[now] = low[now] = ++ Time;
s1.push(now), ins[now] = 1;
for(int i = _first[now]; i; i = _next[i])
if(!dfn[_to[i]]) tarjan(_to[i]), low[now] = min(low[_to[i]], low[now]);
else if(ins[_to[i]]) low[now] = min(dfn[_to[i]], low[now]);
if(dfn[now] == low[now]){
_num ++;
while(1){
num[_num] ++;
int t = s1.top();
s1.pop(), ins[t] = 0;
belong[t] = _num;
if(t == now) break;
}
}
return;
}
int main(){
scanf("%d%d", &n, &m);
for(int i = 1, a, b; i <= m; i ++)
scanf("%d%d", &a, &b), add(a, b);
for(int i = 1; i <= n; i ++)
if(!dfn[i]) tarjan(i);
for(int i = 1; i <= n; i ++)
for(int j = _first[i]; j; j = _next[j])
if(belong[i] != belong[_to[j]]) out[belong[i]]++;
int ans = 0;
for(int i = 1; i <= _num; i ++)
if(!out[i])
if(ans != 0){
printf("0");
return 0;
}else ans = num[i];
printf("%d", ans);
return 0;
}