挑战程序设计中2,有空看。。
#include <iostream>
#include <string.h>
#include <vector>
#include <cstdio>
using namespace std;
const int N=10010;
int dfn[N],in[N],out[N],belong[N];
int low[N],num[N];
vector<int> ss[N];
int stack[N],instack[N];
int top,index,cnt;
void init(){
memset(dfn,0,sizeof(dfn));
memset(in,0,sizeof(in));
memset(out,0,sizeof(out));
memset(belong,0,sizeof(belong));
memset(low,0,sizeof(low));
memset(num,0,sizeof(num));
memset(ss,0,sizeof(ss));
memset(stack,0,sizeof(stack));
memset(instack,0,sizeof(instack));
}
int min(int x,int y){
if(x<y)
return x;
return y;
}
void targin(int x){
int j;
low[x]=dfn[x]=++index;
stack[++top]=x;
instack[x]=1;
for(int i=0;i<ss[x].size();++i){
j=ss[x][i];
if(dfn[j]==0)
{targin(j);low[x]=min(low[x],low[j]);}
else if(instack[j]){
low[x]=min(low[x],dfn[j]);
}
}
if(dfn[x]==low[x]){
cnt++;
do{
j=stack[top--];
belong[j]=cnt;
num[cnt]++;
instack[j]=0;
}while(x!=j);
}
}
int main(){
//freopen("2.txt","r",stdin);
int n,m;
while(~scanf("%d%d",&n,&m)){
init();
top=index=cnt=0;
int x,y;
while(m--){
scanf("%d%d",&x,&y);
ss[x].push_back(y);
}
for(int i=1;i<=n;++i){
if(dfn[i]==0)
targin(i);
}
/*for(int i=1;i<=n;++i)
printf("%d ",low[i]);
printf("\n");*/
for(int i=1;i<=n;++i){
for(int j=0;j<ss[i].size();++j){
x=belong[i];
y=belong[ss[i][j]];
if(x!=y){
out[x]=1;
in[y]=1;
}
}
}
//printf("cnt==%d\n",cnt);
if(cnt==1)
{
printf("%d\n",n);
continue;
}
int sum=0,count=0,pos;
for(int i=1;i<=cnt;++i){
if(out[i]==0)
{count++; pos=i;}
}
//printf("count==%d\n",count);
//printf("pos")
if(count==1){
for(int i=1;i<=n;++i)
if(belong[i]==pos)
sum++;
printf("%d\n",sum);
}
else
printf("0\n");
}
return 0;
}