传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1051
蒟蒻刚学的SCC……
Code:
/*
ID:zky
OJ:BZOJ
Index:1051
Language:C++
*/
#include<stack>
#include<vector>
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
stack<int>S;
int Scnt=0;
int dfs[10001];
int low[10001];
int tot=0;
int vis[10001];
int ins[10001];
int Belong[10001];
struct edge{
int u,v;
edge(){
}
edge(int _u,int _v):
u(_u),v(_v){}
};
vector<edge>edges;
vector<vector<int> >G;
vector<vector<int> >Scc;
int n,m;
void add(int u,int v){
edges.push_back(edge(u,v));
G[u].push_back(edges.size()-1);
}
void Tarjan(int u){
dfs[u]=low[u]=++tot;
ins[u]=1;
S.push(u);
for(int i=0;i<G[u].size();i++){
edge e=edges[G[u][i]];
if(!dfs[e.v]){
Tarjan(e.v);
low[u]=min(low[u],low[e.v]);
}else if(ins[e.v]){
low[u]=min(low[u],dfs[e.v]);
}
}
if(dfs[u]==low[u]){
int v;
Scnt++;
do{
v=S.top();S.pop();
Belong[v]=Scnt;
ins[v]=0;
}while(u!=v);
}
}
int out[10001];
int main(){
cin>>n>>m;
G.resize(n+1);
for(int i=1;i<=m;i++){
int u,v;
cin>>u>>v;
add(u,v);
}
for(int i=1;i<=n;i++){
if(!dfs[i])
Tarjan(i);
}
for(int i=1;i<=n;i++)
for(int j=0;j<G[i].size();j++){
edge e=edges[G[i][j]];
if(Belong[i]!=Belong[e.v])
out[Belong[i]]++;
}
int ans=0;
int s=0,strong;
for(int i=1;i<=Scnt;i++){
if(out[i]==0){
s++;
strong=i;
}
if(s>1){
puts("0");
return 0;
}
}
for(int i=1;i<=n;i++)
if(Belong[i]==strong)ans++;
cout<<ans<<endl;
return 0;
}