概念:

桥:无向图中删去一条边使得图不再联通,则这条边称为桥

割点:无向图中删去一个点使得图不再联通,则这个点称为割点

算法:

运用到tarjan算法

关于tarjan算法: https://www.bilibili.com/video/av7330663/

求桥: 对于一条边 u -> v, 如果它是树边low[v] > dfn[u], 则这条边为桥, 因为删去了这条边, v无法到达u以及u以上的点

求割点:对于一个点u, 如果它是根节点,且子树个数大于等于2, 则u是割点, 因为删去这个点后它的子树之间不能互相到达

          如果它不是根节点, 假设它有一个儿子为v, 如果low[v] >= dfn[u], 则u是割点, 因为删去u后v无法到达u以上的点

模板:

const int N = 1e5 + 5;
vector<pair<int, int>> g[N];
int low[N], dfn[N], tot = 0;
pair<int, int> fa[N];
bool is_cut[N], is_bridge[N];
void tarjan(int u, pair<int, int> o) {fa[u] = o;dfn[u] = low[u] = ++tot;for (pair<int, int> p : g[u]) {int v = p.fi;if(!dfn[v]) {tarjan(v, {u, p.se});low[u] = min(low[u], low[v]);}else if(v != o.fi) low[u] = min(low[u], dfn[v]);}
}
void solve(int n) {tarjan(1, {1, 1});//求割点int son = 0;for (int v = 2; v <= n; v++) {if(fa[v].fi == 1) son++;else {int u = fa[v].fi;if(low[v] >= dfn[u]) is_cut[u] = true;}}if(son >= 2) is_cut[1] = true;//求桥for (int v = 2; v <= n; v++) {int u = fa[v].fi;if(low[v] > dfn[u]) is_bridge[fa[v].se] = true;}
}

 概念:

边双连通分量:不存在桥的无向图为边双连通图, 极大边双连通图为边双连通分量

思路:边双联通分量与强联通分量类似,一个无向图, 一个有向图

模板:

const int N = 1e5 + 5;
vector<int> g[N];
vector<int> bcc[N];
bool vis[N];
int low[N], dfn[N], stk[N], tot = 0, top = 0, cnt = 0;
void tarjan(int u, int fa) {low[u] = dfn[u] = ++tot;stk[++top] = u;vis[u] = true;for (int v : g[u]) {if(v == fa) continue;if(!dfn[v]) {tarjan(v, u);low[u] = min(low[u], low[v]);}else if(vis[v]) low[u] = min(low[u], dfn[v]);}if(low[u] == dfn[u]) {++cnt;while(stk[top] != u) vis[stk[top]] = false, bcc[cnt].pb(stk[top--]);vis[stk[top]] = false, bcc[cnt].pb(stk[top--]);}
}

点双连通分量:不存在割点的无向图为点双连通图, 极大点双连通图为点双连通分量

模板:

const int N = 1e5 + 5;
vector<int> g[N];
vector<pair<int,int>> bcc[N];
int low[N], dfn[N], tot = 0, top = 0, cnt = 0;
pair<int,int> stk[N];
void tarjan(int u, int fa) {low[u] = dfn[u] = ++tot;for (int v : g[u]) {pair<int,int> e = {u, v};if(!dfn[v]) {stk[++top] = e;tarjan(v, u);low[u] = min(low[u], low[v]);if(low[v] >= dfn[u]) {cnt++;while(stk[top] != e) {bcc[cnt].push_back(stk[top--]);}bcc[cnt].push_back(stk[top--]);}}else if(v != fa ) {if(dfn[v] < dfn[u]) stk[++top] = e, low[u] = min(low[u], dfn[v]);}}
}

转载于:https://www.cnblogs.com/widsom/p/10009709.html

算法笔记--无向图的桥、割点、边双连通分量和点双连通分量相关推荐

  1. tarjan算法与无向图的连通性(割点,桥,双连通分量,缩点)

    基本概念 给定无向连通图G = (V, E) 割点: 对于x∈V,从图中删去节点x以及所有与x关联的边之后,G分裂为两个或两个以上不相连的子图,则称x为割点 割边(桥) 若对于e∈E,从图中删去边e之 ...

  2. tarjan算法求无向图的割点和桥

    tarjan算法求无向图的割点与桥 一篇tarjan算法求割点与桥的完整的解释,写的真的好认真 以下代码来自kuangbin的模板 4.5 图的割点.桥和双连通分支的基本概念 [点连通度与边连通度] ...

  3. Tarjan算法求无向图割边割点、最近公共祖先的总结

     无向图tarjan求割边割点.最近公共祖先总结 割点:删除这个点之后整个图变成不连通的两个部分的点 割点集合:在一个无向图中删除该集合中的所有点,能使原图变成互不相连的连通块的点的集合 点连通度 ...

  4. 001.Tarjan算法:求解图的割点与桥(割边)

    简介: 割边和割点的定义仅限于无向图中.我们可以通过定义以蛮力方式求解出无向图的所有割点和割边,但这样的求解方式效率低.Tarjan提出了一种快速求解的方式,通过一次DFS就求解出图中所有的割点和割边 ...

  5. 强化学习经典算法笔记(十四):双延迟深度确定性策略梯度算法TD3的PyTorch实现

    强化学习经典算法笔记(十四):双延迟深度确定性策略梯度算法TD3的PyTorch实现 TD3算法简介 TD3是Twin Delayed Deep Deterministic policy gradie ...

  6. 0x66.图论 - Tarjan算法与无向图连通性

    目录 一.无向图的割点与桥 割点 桥/割边 时间戳 搜索树 追溯值 二.割边判定法则 三.割点判定法则 1.luogu P3388 [模板]割点(割顶) 2.luogu P3469 [POI2008] ...

  7. 算法笔记(胡凡)学习笔记@Kaysen

    本文旨在记录算法笔记学习过程中的收获和一些知识点,部分易错知识点只针对个人而言,CCF-CSP考试冲鸭!!! Chapter 2 C/C++快速入门(易错知识点) 2.1 基本数据类型 变量定义注意区 ...

  8. C++算法篇:DFS超详细解析(2)--- tarjan算法求无向图割边

    <<<上一篇 系列文章目录 ①:无向图基本概念 ②:tarjan算法求无向图割边 前言 第一次写算法,讲得肯不透彻,有误还请指教awa 文章目录 系列文章目录 一.回顾 二.tarj ...

  9. 《算法笔记》——笔记

    算法笔记 胡凡 曾磊 主编 机械工业出版社 文章目录 算法笔记 C/C++快速入门 提醒 memset sscanf与sprintf 引用 浮点数的比较 圆周率 复杂度 黑盒测试 入门篇(1)--入门 ...

最新文章

  1. 51单片机程序及调试步骤实战经验
  2. 计算机基础操作与应用实训教程,计算机应用基础实训教程の第 3 章 Word 2003 基本操作.pdf...
  3. Qt中的QDialog
  4. c语言程序设计2014春第一套作业,C语言程序设计2014春第一套作业
  5. 【算法竞赛学习】金融风控之贷款违约预测-数据分析
  6. 微信小程序 - 点击事件传递参数(简单详细)
  7. android刷机教程基础篇
  8. 盘点,腾讯手机管家的那些你不知道的小功能。
  9. i微信编辑器服务器,i排版微信编辑器
  10. High Performance Visual Tracking with Siamese Region Proposal Network 阅读笔记
  11. [部署系列之一]轻松搞定水晶报表9.2打包
  12. 图神经网络的图网络学习(上)
  13. Java并发编程(一):并发编程的挑战
  14. MATLAB在动态经济学中的应用,MATLAB在动态经济学中的应用
  15. 安装配置Tomcat(CentOS7)
  16. 一款功能强大的IP查询工具!
  17. ICS验厂辅导,ICS认证与BSCI认证的不同点主要体现在那方面
  18. VBA生成和为定值的随机数
  19. Python爬虫实战:爬取股票信息
  20. C++ 浅谈之二叉搜索树

热门文章

  1. Atamai 手术导航软件开发包
  2. 求最长XX序列的两种方法
  3. Tomcat5的数据库连接池配置
  4. 关于setInterval设置倒计时只执行一次,clearInterval停止
  5. Java小白的干货铺子(四)
  6. Daily Scrum10 11.14
  7. rundeck 内存溢出
  8. win7下手动配置apache+ php + mysql 记
  9. 最容易“杀死”女人的30句话
  10. 数据挖掘-二手车价格预测 Task02:数据分析