强连通 双联通 2-SAT

本文介绍了一种求解割点的算法,通过一次深度优先搜索(DFS)遍历即可找到图中的所有割点。割点是指若去掉该点及其相连的所有边,则图将分裂成多个连通分量的点。算法利用了dfn和low两个数组,其中dfn记录每个点首次被访问的时间,low则用于更新每个点能够回溯到的最早时间。割点的判断条件包括:1)根节点有超过一个的子节点;2)非根节点有至少一个子节点的low值大于等于该点的dfn值。

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

1.求割点

int clock,ans,root,cur[N];
void dfs(int u,int fa)
{
    dfn[u]=low[u]=++clock;
    int son=0;
    for(int i=0;i<V[u].size();i++)
    {
        int to=V[u][i];
        if(to==fa)continue;
        if(!dfn[to])
        {
            dfs(to,u);
            low[u]=min(low[u],low[to]);
            if(low[to]>=dfn[u])son++;
        }
        else low[u]=min(low[u],dfn[to]);
    }
    if(u==root&&son>1) cur[u]=son;
    else if(u!=root&&son) cur[u]=son+1;
    else cur[u]=0;
}

clock 记录进入该深搜子树的时间戳,ans记录割点的数量,root记录根。

从任意一点进行一遍dfs就能得到所有的割点。

某一点为割点的条件

1.该点根节点且至少有两个子女(此时去点此点,两个子女即断开了)

2.该点不是根节点,但是至少有一个子女的low值大于当前的dfn值(说明至少有一个子女不能通过回边到达u的祖先)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值