首页 > 编程语言 >Tarjan算法和连通性相关(三)

Tarjan算法和连通性相关(三)

时间:2024-08-03 10:30:27浏览次数:11  
标签:Tarjan 连通性 int 连通 割点 算法 dfn low 分量

上一篇博客我们介绍了割点和桥,本文我们继续学习与连通性有关的一些概念

边双连通分量

什么是边双连通分量?

在一张连通的无向图中,对于两个点 u 和 v,如果无论删去哪条边(只能删去一条)都不能使它们不连通,我们就说 u 和 v 边双连通,边双联通分量是极大的边双连通子图

怎么求边双连通分量?

由于边双连通分量中去除任意一条边后,分量依然是连通的,所以边双连通分量中没有桥,故原图的边双连通分量等价于删去桥边后边双连通分量即可

等等,这不是相当于把桥删去,求强连通分量吗?!

代码如下:

void tarjan(int u,int father){
  dfn[u]=low[u]=++dfncnt;
  for(auto v:g[u]){
    if(!dfn[v]){
      tarjan(v,u);
      low[u]=min(low[u],low[v]);
      if(low[v]>dfn[u])bridges[u]=bridges[u^1]=true;
    }else if(u!=(father^1))low[u]=min(low[u],dfn[v]);
  }
}
void dfs(int u){
    vis[u]=1;
    for(auto v:g[u]){
        if(bridges[u])continue;
        if(!vis[v])dfs(v);
    }
}
int main(){
  for(register int i=1;i<=n;++i)
    if(!dfn[i])tarjan(i,i);
    for(register int i=1;i<=n;++i)
        if(!vis[i]){
            dfs(i);
            ++dcccnt;
        }
}

点双连通分量

什么是点双连通分量?

在一张连通的无向图中,对于两个点 u 和 v,如果无论删去哪个点(只能删去一个,且不能删 u 和 v 自己)都不能使它们不连通,我们就说 u 和 v 点双连通,点双联通分量是极大的点双连通子图

怎么求点双连通分量?

我们需要知道几个性质:

1.两个点双最多只有一个公共点(即都有边与之相连的点,因为当它们有两个及以上公共点时,它们可以合并为一个新的点双

2.这个点在这两个点双和它形成的子图中是割点,因为当对于这个子图而言它不是一个割点时,这两个点双也可以合并为一个新的点双

读者可以自行证明,这里就不加赘述

进一步,我们可以发现,对于一个点双,它在DFS搜索树中的dfn值最小的点一定是割点或者树根

当这个点是割点时,它所属的点双必定不能向它的父亲方向包括更多点,当这个点是树根时,它的dfn是整棵树里最小的,如果有两个以上的子树,那么它是割点,否则它是属于它的直系儿子的点双

一个点双一定在这两类点的子树中,代码如下:

void tarjan(int u, int father) {
	int son = 0;
	low[u]=dfn[u]=++dfncnt;
	s[++tp]=u;
	for(auto v:g[u]){
		if(!dfn[v]){
			son++;
			tarjan(v,u);
			low[u]=min(low[u],low[v]);
			if(low[v]>=dfn[u]){
				bcc++;
				while(s[tp+1]!=v)ans[bcc].push_back(s[top--]);//将子树出栈
				ans[bcc].push_back(u);//把割点/树根也丢到点双里
			}
		} else if(v!=fa)low[u]=min(low[u],dfn[v]);
	}
	if(fa==0&&son==0)ans[++bcc].push_back(u);//特判独立点
}

标签:Tarjan,连通性,int,连通,割点,算法,dfn,low,分量
From: https://www.cnblogs.com/isletfall/p/18339129

相关文章

  • 「代码随想录算法训练营」第二十八天 | 动态规划 part1
    509.斐波那契数题目链接:https://leetcode.cn/problems/fibonacci-number/题目难度:简单文章讲解:https://programmercarl.com/0509.斐波那契数.html视频讲解:https://www.bilibili.com/video/BV1f5411K7mo题目状态:过!思路:当n=0时,返回0;当n=1时,返回1;当n>=2时,返回fib(......
  • 匈牙利算法--二分图的最大匹配
    匈牙利算法--二分图的最大匹配给定一个二分图,其中左半部包含 n1个点(编号 1∼n1),右半部包含 n2 个点(编号 1∼n2),二分图共包含 m 条边。数据保证任意一条边的两个端点都不可能在同一部分中。请你求出二分图的最大匹配数。二分图的匹配:给定一个二分图 G,在 G的一个子......
  • 基础算法:离散化(C++实现)
    文章目录1.离散化的定义2.离散化例题2.1离散化+二分2.2离散化+哈希表1.离散化的定义离散化是一种在程序设计和算法优化中常用的技术,其核心思想是将无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。具体来说,离散化是在不改变数据相对大小的条......
  • 2024“钉耙编程”中国大学生算法设计超级联赛(5)
    目录写在前面101110131006100810021005写在最后写在前面补题地址:https://acm.hdu.edu.cn/listproblem.php?vol=65,题号7481~7493。以下按个人难度向排序。比较顺利的一场,今天双人双题环节没有卡太久,赢!置顶广告:中南大学ACM集训队绝赞招新中!有信息奥赛基础,获得NOIP省一等......
  • (算法)组合总和————<递归>
    1.题⽬链接:39.组合总和 2.题⽬描述:3.解法:算法思路:candidates的所有元素互不相同,因此我们在递归状态时只需要对每个元素进⾏如下判断:1.跳过,对下⼀个元素进⾏判断;2.将其添加⾄当前状态中,我们在选择添加当前元素时,之后仍可以继续选择当前元素(可以重复选择同⼀元素......
  • 算法·理论:KMP 笔记
    \(\text{KMP}\)笔记!上次比赛,出题人出了一个\(\text{KMP}\)模板,我敲了个\(\text{SAM}\)跑了,但是学长给的好题中又有很多\(\text{KMP}\),于是滚回来恶补字符串基本算法。\(\text{KMP}\)是上个寒假学的,为什么最近才完全理解,但\(\text{KMP}\)短小精悍,极其精简,确实难懂,所以很......
  • 2024“钉耙编程”中国大学生算法设计超级联赛(5)
    Preface唉感觉最近把把红温负作用啊,这场就中期写05被卡常了就红温了一整场,放着更简单的题不写就疯狂乱搞结果不出所料地被打爆了,只能说是好似,赛后发现甚至有个题是去年一轮的原,结果比赛的时候没一个人看题意,属实绷不住了感觉现在每场的策略和心态都有很大问题啊,不把这些问题......
  • 【眼疾病识别】图像识别+深度学习技术+人工智能+卷积神经网络算法+计算机课设+Python+
    一、项目介绍眼疾识别系统,使用Python作为主要编程语言进行开发,基于深度学习等技术使用TensorFlow搭建ResNet50卷积神经网络算法,通过对眼疾图片4种数据集进行训练('白内障','糖尿病性视网膜病变','青光眼','正常'),最终得到一个识别精确度较高的模型。然后使用Django框架开发Web网......
  • 二分算法思路及解题代码
    二分算法一、第一种二分(easy)例题一:力扣704.二分查找-力扣(LeetCode)方法:1.暴力循环遍历,时间复杂度为O(n),代码太简单就省略了也不建议用这种方法2.二分算法(重点)时间复杂度O(logn)解法思路:如果利用暴力那么这道题有一个很重要的条件没有用,那就是有序,如果选取......
  • 【数据结构算法经典题目刨析(c语言)】判断链表是否有环(图文详解)
    ......