求强连通分量个数
View Code
void tarjan(int u) { dfn[u]=low[u]=++idx ; vis[u]=1 ; st[++tp]=u ; int v ; for(int i=head[u];i;i=e[i].next) { v=e[i].t ; if(!dfn[v]) { tarjan(v) ; low[u]=min(low[u],low[v]) ; } else if(vis[v]) low[u]=min(low[u],dfn[v]) ; } if(dfn[u]==low[u]) { ans++ ; while(1) { v=st[tp--] ; vis[v]=0 ; belong[v]=ans ; if(u==v) break ; } } }