P2863
https://www.luogu.com.cn/problem/P2863
3个点TLE
#include<bits/stdc++.h>
#define maxn 10005
using namespace std;
int n,m,ans,dfn[maxn],low[maxn],st[maxn],top;
bool ins[maxn];
int cnt,idx,siz[maxn],bel[maxn];
int head[maxn],nxt[maxn],to[maxn],tot;
void addedge(int b,int e){
nxt[++tot]=head[b];to[head[b]=tot]=e;
}
void tarjan(int u){
low[u]=dfn[u]=++cnt;
ins[st[++top]=u]=true;
for(int i=head[u];i;i=nxt[i]){
if(!dfn[to[i]]){
tarjan(to[i]);
low[u]=min(low[u],low[to[i]]);
}else if(ins[to[i]]){
low[u]=min(low[u],dfn[to[i]]);
}
}
if(low[u]==dfn[u]){
int v;++idx;
do{
v=st[top--];
bel[v]=idx;
ins[v]=false;
++siz[idx];
}while(v!=u);
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
int u,v;
cin>>u>>v;
addedge(u,v);
}
for(int i=1;i<=n;i++)
if(!dfn[i])tarjan(i);
for(int i=1;i<=idx;i++)
ans+=siz[i]>1;
cout<<ans<<'\n';
return 0;
}