targan
无向图
inline void tarjan(int x,int fa){
int son=0;
dfn[u]=dfn[fa]=++tot;
for(int i=fir[u];i;i=e[i].nxt){
int v=e[i].v;
if(!dfn[v]){
son++;
low[u]=min(low[u,low[v]]);
if(low[u]>=dfn[u]) flag[u]=1;
}
else if(v!=fa) low[u]=min(low[u],dfn[v]);
if(u==root&&son==1) flag[u]=0;
}
}
有向图
inline void tarjan(int u){
dfn[u]=low[u]=++tot;
vis[u]=1;
sta[++top]=u;
for(int i=fir[u];i;i=e[i].nxt){
int v=e[i].v;
if(!dfn[v]){
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(vis[v]) low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u]){
col++;
do{
int x=sta[top--];
vis[x]=0;
scc[x]=col;
}while(x!=u);
}
}