#include<bits/stdc++.h>
using namespace std;
typedef int lsqxx;
struct lq{
lsqxx v,nxt;
}e[200005];
lsqxx h[20005],cnt;
void add(lsqxx u,lsqxx v)
{
e[++cnt].v=v;e[cnt].nxt=h[u];h[u]=cnt;
}
int n,m;
int x,y;
int dfn[10005],low[10005],fn,fdfn[10005];
int vis[10005],dis[10005];
void tarjan(int t)
{
vis[t]=1;
dis[t]=1;
if(!dfn[t])
dfn[t]=low[t]=++fn,fdfn[dfn[t]]=t;
for(int i=h[t];i;i=e[i].nxt)
{
int v=e[i].v;
if(vis[v])
{
low[t]=min(low[t],low[v]);
}
else
{
if(vis[low[v]])
low[t]=min(low[t],low[v]);
if(dis[v]) continue;
tarjan(v);
if(vis[low[v]])
low[t]=min(low[t],low[v]);
}
}
vis[t]=0;
}
int ans=0;
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
scanf("%d%d",&x,&y),add(x,y);
for(int i=1;i<=n;i++)
if(!dis[i])
tarjan(i);
for(int i=1;i<=n;i++)
{
if(dfn[i]!=low[i]&&vis[fdfn[low[i]]]!=1)
vis[fdfn[low[i]]]=1,ans++;
}
cout<<ans<<endl;
return 0;
}
上面代码32分
注释一行36分
#include<bits/stdc++.h>
using namespace std;
typedef int lsqxx;
struct lq{
lsqxx v,nxt;
}e[200005];
lsqxx h[20005],cnt;
void add(lsqxx u,lsqxx v)
{
e[++cnt].v=v;e[cnt].nxt=h[u];h[u]=cnt;
}
int n,m;
int x,y;
int dfn[10005],low[10005],fn,fdfn[10005];
int vis[10005],dis[10005];
void tarjan(int t)
{
vis[t]=1;
dis[t]=1;
if(!dfn[t])
dfn[t]=low[t]=++fn,fdfn[dfn[t]]=t;
for(int i=h[t];i;i=e[i].nxt)
{
int v=e[i].v;
if(vis[v])
{
low[t]=min(low[t],low[v]);
}
else
{
if(vis[low[v]])
low[t]=min(low[t],low[v]);
// if(dis[v]) continue;
tarjan(v);
if(vis[low[v]])
low[t]=min(low[t],low[v]);
}
}
vis[t]=0;
}
int ans=0;
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
scanf("%d%d",&x,&y),add(x,y);
for(int i=1;i<=n;i++)
if(!dis[i])
tarjan(i);
for(int i=1;i<=n;i++)
{
if(dfn[i]!=low[i]&&vis[fdfn[low[i]]]!=1)
vis[fdfn[low[i]]]=1,ans++;
}
cout<<ans<<endl;
return 0;
}