Tarjan算法求割点

本文介绍了Tarjan算法,用于寻找无向图中的割点,通过递归实现深度优先搜索,并在代码中详细展示了如何标记节点、更新low值和判断割点的过程。理解这个算法有助于在图论问题中识别关键结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

int h[], e[], ne[], idx;  // 邻接表
int dfn[], low[], timestamp;
bool cut[];  // 判断一个点是否为割点
int rt;  // 根节点

// tarjan算法求割点
void tarjan(int u) {  
    // 进入u时,先标记时间戳
    dfn[u] = low[u] = ++ timestamp;
    int son = 0;
    
    for (int i = h[u]; ~i; i = ne[i]) {
        int j = e[i];  // 取出
        if (!dfn[j]) {  // 如果j尚未访问
            tarjan(j);
            // 返回时更新low,判割点
            low[u] = min(low[u], low[j]);
            if (low[j] >= dfn[u]) {
                son ++ ;  // 子树个数
                if (u != rt || son > 1) {  //判断割点条件
                    cut[u] = true;
                }
            }
        } else {  // 如果j已访问
            low[u] = min(low[u], dfn[j]);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值