标题1
区块
标题2
标题3
标题4
列表
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<vector>
#include<stack>
using namespace std;
//---------------------
const int maxn=10000+50,maxm=50000+50;
int ans,n,m,dfsn[maxn],low[maxn],dfs_clock,scc_cnt,scc_no[maxn],out_degree[maxn];
stack<int> S;
vector<int> G[maxn];
//---------------------
inline void add_edge(int u,int v){
G[u].push_back(v);
}
inline void dfs(int u){
dfsn[u]=low[u]=++dfs_clock;
S.push(u);
for(int i=0;i<G[u].size();i++){
if(!dfsn[G[u][i]]){
dfs(G[u][i]);
low[u]=min(low[u],low[G[u][i]]);
}
else if(!scc_no[G[u][i]])
low[u]=min(low[u],dfsn[G[u][i]]);
}
if(low[u]==dfsn[u]){
scc_cnt++;
int x;
for(;;){
x=S.top();S.pop();
scc_no[x]=scc_cnt;
if(x==u) break;
}
}
}
inline void find_scc(){
for(int i=1;i<=n;i++)
if(!dfsn[i])
dfs(i);
}
inline void get_outdegree(){
for(int i=1;i<=n;i++)
for(int j=0;j<G[i].size();j++)
if(scc_no[i]!=scc_no[G[i][j]])
out_degree[scc_no[i]]++;
}
//---------------------
int main(){
freopen("h.in","r",stdin);
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int a,b;
scanf("%d%d",&a,&b);
add_edge(a,b);
}
find_scc();
get_outdegree();
int want;
for(int i=1;i<=scc_cnt;i++)
if(!out_degree[i])
want=i,ans++;
if(ans>1) ans=0;
else{
ans=0;
for(int i=1;i<=n;i++)
if(scc_no[i]==want)
ans++;
}
cout<<ans;
return 0;
}