用Tarjan算法求无向连通图割点&&割边

本文介绍了如何运用Tarjan算法求解无向连通图中的割点和割边。通过定义`cut`数组标记割点,`dfn`和`low`数组记录层次信息,并利用深度优先搜索遍历图中的节点。当删除某个节点或边导致图不连通时,该节点或边即为割点或割边。提供了C++代码示例实现这一过程。

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

/**
    割点割边挺好理解的,割点就是一个无向连通图,把其中一个点
    挖掉剩下的图不连通,割边就是把一条边砍掉不连通

    比如:有一个通信网络,要求一颗炸弹,把这个通信网络搞得不连通,问
    炸哪个点或哪条边。

    Tarjan 算法实现求割边和割点很类似,不过还是有点不同,复杂度为O(N+M)

    下面用 <vector> 存边写下
*/

//求割点

#include <vector>
bool cut[nMax];   //cut[x] = ture 代表x 为割点
int dfn[nMax], low[nMax];  //dfn[x] x是当前层次,low[x] x是能到得的最低层次
//这两个或许有点摸不着头脑,不过没关系,
//查下tarjan 自己画画差不多就能理解,tarjan只是个帅哥名字,没那么可怕
vector<int> adj[nMax];
int rt, rt_num; //起始节点和访问此结点的次数,如果大于一则rt也为割点
//用于判断起始结点是否也是割点
/**
    nMax为点的个数;
    rt选任意一点;
    rt_num = 0;
*/

void addEdge(int u, int v) {
    adj[u].push_back(v);
    adj[v].push_back(u);
}

void findcut(int dep, int u) {
    dfn[u] = low[u] = dep;
    for (int i=0; i<adj[u].size(); i++) {
        int v = adj[u][i];
        if (!dfn[v]) {
            findcut(dep+1, v);
            if (u == rt)
                rt_num++;
            else {
                low[u] = min(low[u], low[v]);
                if (low[v] >= dfn[u])
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值