题目链接:http://poj.org/problem?id=3180
没什么意思直接套模板就行
code:
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <cstring>
using namespace std;
const int maxn=10010;
const int maxe=80000;
struct edge
{
int to,next;
} P[maxe];
int head[maxn],si;
int low[maxn],dfn[maxn],sst[maxn],belong[maxn];
int index,top;
int scc;
bool in_sst[maxn];
int num[maxn];
int N,M;
void add_edge(int s,int t)
{
P[si].to=t;
P[si].next=head[s];
head[s]=si++;
}
void Tarjan(int u)
{
int v;
low[u]=dfn[u]=++index;
sst[top++]=u;
in_sst[u]=true;
for(int i=head[u];i!=-1;i=P[i].next){
v=P[i].to;
if(!dfn[v]){
Tarjan(v);
if(low[u]>low[v]) low[u]=low[v];
}
else if(in_sst[v]&&low[u]>dfn[v]) low[u]=dfn[v];
}
if(low[u]==dfn[u]){
scc++;
while(1){
v=sst[--top];
in_sst[v]=false;
belong[v]=scc;
num[scc]++;
if(v==u) break;
}
}
}
void solve(int N)
{
memset(dfn,0,sizeof(dfn));
memset(in_sst,0,sizeof(in_sst));
memset(num,0,sizeof(num));
index=scc=top=0;
for(int i=1;i<=N;i++) if(!dfn[i]) Tarjan(i);
}
int main()
{
int s,t,cnt;
while(scanf("%d%d",&N,&M)!=EOF){
memset(head,-1,sizeof(head));
si=0;
for(int kk=0;kk<M;kk++){
scanf("%d%d",&s,&t);
add_edge(s,t);
}
solve(N);
cnt=0;
for(int i=1;i<=scc;i++) if(num[i]>=2) cnt++;
printf("%d\n",cnt);
}
}