学习笔记——割点与桥
一、割点、桥基本概念
给定无向图
对于一个点
对于一条边
二、暴力算法
对于割点,枚举每个点,看删去这个点后整个图是否连通,若不连通则此点为割点。
对于桥,枚举每条边,看删去这条边后整个图是否连通,若不连通则此边为桥。
朴素做法时间复杂度:
三、Tarjan 算法
定义
定义
(蓝框数字表示
那么问题转化为
dfs 过程中,正在节点
,代表 未被遍历过,则 为 的子节点。则 作为 的子节点,一定会对 做出贡献:
(即如果子节点能到达更小
,代表 已经被遍历过,则 按照 dfs 的规律, ,则边 为一条从 到 的返祖边。此时,
(即用
四、割点的判定
-
对于根节点,若有两棵及以上的子树,则根节点为割点。
-
对于非根节点
,若其子树中任意一个节点 ,均满足
则说明该节点为割点。因为一旦去除
五、桥的判定
- 对于边
,若 的子树中任意一个节点 ,均满足
则说明该边为割边。因为一旦去边
参考核心代码:
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]);
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具