[学习笔记]tarjan求割点

求割点与强连通分量算法
本文介绍了一种求解有向图中割点与强连通分量的算法实现。通过Tarjan算法进行深度优先搜索,并在过程中记录每个节点的访问顺序和最低可达节点,以此来判断哪些节点是割点。文章提供了具体的代码实现。

都口胡了tarjan求割边,就顺便口胡tarjan求割点好了QAQ

dfn[\;],low[\;]的定义同tarjan求有向图强连通分量.

枚举当前点u的所有邻接点v:

1.如果某个邻接点v未被访问过,则访问v,并在回溯后更新low[u]=min(low[u],low[v]);

2.如果某个邻接点v已被访问过,则更新low[u]=min(low[u],dfn[v]).

对于当前节点u,

如果u为搜索树中的根节点,若它的子节点数\geq2(根是多棵子树上节点的唯一连通方式),则u为割点;

如果u为搜索树上的非根节点,若存在子节点v满足low[v]$\geq$dfn[u](v向上无法到达u的祖先),则u为割点.

inline void tarjan(int u,int fa){
    dfn[u]=low[u]=++cnt;
    for(int i=g[u];i;i=e[i].nxt){
        ++t[u];
        if(!dfn[e[i].to]){
            tarjan(e[i].to,u);
            low[u]=min(low[u],low[e[i].to]);
            if(u==1){
                if(t[u]>=2) cut[u]=true;
            }
            else if(low[e[i].to]>=dfn[x]) cut[u]=true;
        }
        else if(e[i].to!=fa)
            low[u]=min(low[u],dfn[e[i].to]);
    }
}

转载于:https://www.cnblogs.com/AireenYe/p/6049111.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值