首页 > 其他分享 >学习笔记——割点与桥

学习笔记——割点与桥

时间:2024-02-05 11:44:56浏览次数:24  
标签:连通 int 割点 笔记 学习 dfn low 节点

一、割点、桥基本概念

给定无向图 \(G=(V,E)\)。

对于一个点 \(u \in G\) ,删除一个节点 \(u\)与该节点所有相连的边后,该图不连通,则称点 \(u\) 为割点。

对于一条边\(\{U,W\} \in G\),删除一条边 \(\{U,W\}\) 后,该图不连通,则称边 \(\{U,W\}\) 为桥。

二、暴力算法

对于割点,枚举每个点,看删去这个点后整个图是否连通,若不连通则此点为割点。

对于桥,枚举每条边,看删去这条边后整个图是否连通,若不连通则此边为桥。

朴素做法时间复杂度: \(O(n(n+m))\),复杂度极高。

三、Tarjan 算法

定义 \(dfn[i]\) 表示节点 \(i\) 的 dfs 序。如图:

定义 \(low[i]\) 表示节点 \(i\) 通过返祖边和绕路,能到达的节点里最小的 dfn 值。如图:

(蓝框数字表示 \(low\),红框数字表示 \(dfn\))

那么问题转化为 \(low\) 的求法。

dfs 过程中,正在节点 \(u\),有边 \((u,v)\),有两种情况:

  • \(vis[v]=0\),代表 \(v\) 未被遍历过,则 \(v\) 为 \(u\) 的子节点。则 \(v\) 作为 \(u\) 的子节点,一定会对 \(u\) 做出贡献:

\[low[u]=\min(low[u],low[v]) \]

(即如果子节点能到达更小 \(dfn\) 的点,点 \(u\) 也一定能沿着子节点到达)

  • \(vis[v]=1\),代表 \(v\) 已经被遍历过,则 按照 dfs 的规律,\(dfn[v]<dfn[u]\),则边 \((u, v)\) 为一条从 \(u\) 到 \(v\) 的返祖边。此时,

\[low[u]=\min(low[u], dfn[v]) \]

(即用 \(u\) 已经搜索到的最小 \(dfn\) 的节点与 \(v\) 节点进行比较)

四、割点的判定

  • 对于根节点,若有两棵及以上的子树,则根节点为割点。

  • 对于非根节点 \(u\),若其子树中任意一个节点 \(v\) ,均满足

\[dfn[u] \le low[v] \]

则说明该节点为割点。因为一旦去除 \(u\),则 \(u\) 的子树与其他节点并不连通。

五、桥的判定

  • 对于边 \(\{U,W\}\),若 \(w\) 的子树中任意一个节点 \(v\) ,均满足

\[dfn[w] < low[v] \]

则说明该边为割边。因为一旦去边 \(\{U,W\}\),则 \(w\) 的子树与其他节点并不连通。

参考核心代码:

void tarjan(int x){
	dfn[x]=low[x]=++num;
	int f=0;
	for (int i=head[x]; i; i=nxt[i]){
		int y=ver[i];
		if(!dfn[y]){
			tarjan(y);
			low[x]=min(low[x], low[y]); 
			if(low[y]>=dfn[x]){ //求割点,如果是割边换成low[y]>dfn[x]
				f++;
				if(x!=root||f>1) cut[x]=1;
			}
		}
		else low[x]=min(low[x], dfn[y]);
	}
}

标签:连通,int,割点,笔记,学习,dfn,low,节点
From: https://www.cnblogs.com/ylc666/p/18007680

相关文章

  • Erlang 学习之第三天 . 函数,模块,递归,数字,字符串
    Erlang函数Erlang是一种众所周知的函数式编程语言,因此您将看到许多关于函数如何在Erlang中工作的重点。本章介绍如何使用Erlang中的函数完成所有操作。直接上实例:定义函数add(X,Y) ->    Z = X+Y,    io:fwrite("~w~n",[Z]). start() ->    add(5,6).......
  • SM学习总结
    图的应用(1)---updatebylgj   拓扑序列 测试1  拓扑序列练习  测试2 拓扑排序-cn是大帅哥886-博客园(cnblogs.com) 断网测试1 断网测试1-拓扑排序-TimelineG(拓扑排序)-cn是大帅哥886-博客园(cnblogs.com) priority_queue简介与用法......
  • 浮木云学习日志(7)---可视化大屏搭建
    之前对浮木云的web端的静态页面和APP的页面搭建进行了简单的记录,虽然只是了解些皮毛,但足够支撑一些简单的页面的制作。最近我在浏览他们的公众号【武汉浮木科技有限公司】,意外发现他们对高校科技成果转化平台的模板进行了相关介绍,看了他们对这个平台的介绍,让我觉得他们对这个业务......
  • 假期想学习,送你测试开发+人工智能大礼包
    测试管理班是专门面向测试与质量管理人员的一门课程,通过提升从业人员的团队管理、项目管理、绩效管理、沟通管理等方面的能力,使测试管理人员可以更好的带领团队、项目以及公司获得更快的成长。提供1v1私教指导,BAT级别的测试管理大咖量身打造职业规划。春节将至,大家在享受假......
  • c++11的左值 右值的笔记
    在C++11的程序中,所有的值必须属于左值,将亡值,纯右值之一。将忘值则是c++11新增的跟右值引用相关的表达式,这样表达式通常是将要被移动的对象(以为他用),比如返回右值引用T&&的函数返回值,std::move的返回值,或者转换为T&&的类型的转换函数的返回值。而剩余的,可以标识函数、对象的值都属......
  • service命令使用笔记
    一、简介#service--helpUsage:service[-h|-?]servicelistservicecheckSERVICEservicecallSERVICECODE[i32N|i64N|fN|dN|s16STR|null|fdf|nfdn|afdf]...Options:i32:Writethe32-bitintegerNintothes......
  • [解决办法]笔记本win11 win10系统亮度自动降低 关闭自动对比度自动亮度自适应
    https://www.bilibili.com/video/BV18K411k7AJ解决办法整理:控制面板:控制面板\所有控制面板项\电源选项\编辑计划设置这里的显示里面有的电脑有自动降低亮度相关设置英特尔显卡管理面板-功率菜单,节能功能关闭。(微软商店可以装这个软件)首先,他节约不少多少点能服务-......
  • 【学习笔记】网络流与二分图初步
    网络流与二分图初步我们约定,对于有向图\(G=(V,E)\),分析复杂度时\(m=|E|,n=|V|\)。在分析时间复杂度时,网络流的实际表现基本都优于其理论上的时间复杂度表现。I概念(1)网络流:在一个有向带权图上(不考虑自环和重边),与最短路类似,我们定义一个源点\(s\)和一个汇点\(t\)......
  • 读千脑智能笔记04_参考系
    1.      大脑中的参考系1.1.        人类出色的认知功能是区分我们与灵长目动物的最显著的特点1.1.1.          只有人类才能使用复杂的语言,制造诸如计算机等复杂的工具,并且能够论证进化、遗传学和民主等概念1.2.        人类大脑新皮质......
  • 深度学习-DNN深度神经网络-反向传播02-python代码实现nn-41
    目录1.举例2.python实现1.举例2.python实现importnumpyasnpfromsklearn.datasetsimportfetch_mldatafromsklearn.utils.extmathimportsafe_sparse_dotdeftrain_y(y_true):y_ohe=np.zeros(10)y_ohe[int(y_true)]=1returny_ohemnist......