题目链接:
https://www.luogu.org/problem/P2863
思路:
1:全裸的tarjan算法
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e4+1;
vector<int>e[maxn];
int dfn[maxn],low[maxn],cnt,vis[maxn],n,m,a,b,ans;
stack<int>s;
void tarjan(int x){
low[x]=dfn[x]=++cnt;
s.push(x);
vis[x]=1;
for(int i=0;i<e[x].size();i++){
int v=e[x][i];
if(!dfn[v]){
tarjan(v);
low[x]=min(low[x],low[v]);
}
else if(vis[v]){
low[x]=min(low[x],dfn[v]);
}
}
if(low[x]==dfn[x]){
int tot=0;
while(1){
int now=s.top();
s.pop();
vis[now]=0;
tot++;
if(now==x)break;
}
if(tot>1) ans++;
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>a>>b;
e[a].push_back(b);
}
for(int i=1;i<=n;i++){
if(!dfn[i])
tarjan(i);
}
cout<<ans<<endl;
return 0;
}