tarjan算法
tarjan算法
无向图的上的tarjan与有向图同理,只不过没有横叉边。 对于边(u,v),若low[v]>dfn[u],则 (u,v)是桥,若low[v]>=dfn[u],则u是割点(只有一个儿子的根节点除外)
void tarjan(int u,int fa){
dfn[u]=low[u]=++dfs_clock;
for(int i=head[u];i;inxt[i]){
int v=l[i].t;
if(fa==v) continue;
if(!dfn[v]){
tarjan(v,u);
low[u]=min(low[u],low[v]);
if(low[v]>dfs[u])
bcnt++,bri[l[i].id]=1;
}
else if(dfn[v]<dfn[u])
low[u]=min(dfn[v]);
}
}
复杂度均为线性,一般情况下tarjan主要干的是图上问题转化成DAG或树上问题去求解。涉及到“连通性”的题目可以考虑用tarjan简化问题。