感觉思路没问题可只拿了48pts,回复闭关
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e4+5;
struct node{
int nt,end;
}edge[50005];
int cnt,head[N];
void add(int u,int v){
cnt++;
edge[cnt].nt=head[u];
head[u]=cnt;
edge[cnt].end=v;
}
int dfn[N],low[N],vis[N],co[N],tot,col;
stack<int> stk;
void tarjan(int u){
dfn[u]=low[u]=++tot;
stk.push(u);
vis[u]=1;
for(int i=head[u];i;i=edge[i].nt){
int v=edge[i].end;
if(dfn[v]==0){
tarjan(v);
low[u]=min(low[u],low[v]);
}else if(vis[v]==1){
low[u]=min(low[u],low[v]);
}
}
if(dfn[u]==low[u]){
co[u]=++col;
while(stk.top()!=u){
co[stk.top()]=col;
vis[stk.top()]=0;
stk.pop();
}
vis[u]=0;
stk.pop();
}
return ;
}
int n,m,u,v;
int number[N],fan[N],ans;
signed main(){
scanf("%lld%lld",&n,&m);
for(int i=1;i<=m;i++){
scanf("%lld%lld",&u,&v);
add(u,v);
}
for(int i=1;i<=n;i++){
if(!dfn[i])tarjan(i);
}
for(int i=1;i<=n;i++){
number[co[i]]++;
fan[co[i]]++;
}
for(int i=1;i<=n;i++){
for(int j=head[i];j;j=edge[j].nt){
int v=edge[j].end;
if(co[i]!=co[v])fan[co[v]]+=number[co[i]];
}
}
for(int i=1;i<=n;i++){
if(fan[co[i]]==n)ans++;
}
printf("%lld",ans);
return 0;
}