POJ 3180

强联通分量班子题,Tarjan统计大于等于2的强联通分量个数即可

#include<cstdio>
#include<iostream>
#define N 11000
using namespace std;
int to[N*10],cnt,nxt[N*10],head[N],vis[N],low[N],dfn[N],now;
int ans,z[N],top,n,m,in[N];
void add(int x,int y){
to[++cnt]=y;
nxt[cnt]=head[x];
head[x]=cnt;
}
void dfs(int x){
vis[x]=1;dfn[x]=low[x]=++now;
z[++top]=x;in[x]=1;
for(int i=head[x];i;i=nxt[i]){
if(vis[to[i]]){
if(in[to[i]]) low[x]=min(low[x],dfn[to[i]]);
}else {
dfs(to[i]);
low[x]=min(low[x],low[to[i]]);
}
}
if(low[x]==dfn[x]){
while(z[top]!=x)in[z[top]]=0,top--;
in[x]=0,top--;
}
}
int main(){
int x,y;
scanf("%d%d",&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(!vis[i])
dfs(i);
printf("%d",ans);
}

posted on 2019-05-11 20:21  啊啊啊起个什么名字好  阅读(87)  评论(0编辑  收藏  举报

导航