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简化问题。

posted @ 2022-02-11 14:47  su-yichen  阅读(37)  评论(0编辑  收藏  举报