求图的割点,割边(啊哈算法)
时间戳:深度优先遍历时,访问每个节点的先后顺序从 1到n;
使用 num[] 来记录每个顶点的先后顺序;
满足割点的条件:子节点 v 不经过父节点 u 是不能达到u的祖宗节点的(也就是已经被访问
的那些节点);
使用 low[] 来记录每个节点不经过父节点能到达的最早顶点的时间戳;
因此满足割点的结点是: low[v] >= num[u] ;意思是子节点v不经过父节点u能到达的最早时间
戳也不过是u,那么把u去掉,不就能把图分成两部分了;但是这也仅仅是来检测非根节点的方法,
根节点是否为割点还要特判,如果根节点的子节点有两个孩子,且两个孩子不能相互到达,那么
根节点就是割点;
/**时间戳:深度优先遍历时,访问每个节点的先后顺序从 1到n;使用 num[] 来记录每个顶点的先后顺序;满足割点的条件:子节点 v 不经过父节点 u 是不能达到u的祖宗节点的(也就是已经被访问的那些节点);使用 low[] 来记录每个节点不经过父节点能到达的最早顶点的时间戳;因此满足割点的结点是: low[v] >= num[u] ;意思是子节点v不经过父节点u能到达的最早时间戳也不过是u,那么把u去掉,不就能把图分成两部分了;但是这也仅仅是来检测非根节点的方法,根节点是否为割点还要特判,如果根节点的子节点有两个孩子,且两个孩子不能相互到达,那么根节点就是割点;
*//**data:6 71 41 34 23 22 52 65 6
*//**
#include <iostream>
#include <algorithm>
#include <vector>using namespace std;const int maxn = 1e5+10;
vector<int> Adj[maxn]; ///邻接表
int num[maxn] , low[maxn] ; ///时间戳
int flag[maxn]; ///顶点编号是割点则记为1,否则为0;
int root , index; ///root为根节点,index为时间戳void dfs(int u,int fath) ///fath为u的父节点
{int child = 0; ///u的子节点数目++index; ///时间戳加一num[u] = index;low[u] = index; ///最开始时间戳就是自己for(int i=0;i<Adj[u].size();++i){int v = Adj[u][i];if(num[v] == 0) ///如果v还没被访问过{++child; ///将v归为u的子节点,子节点数目加一dfs(v,u); ///递归low[u] = min(low[u] , low[v]); ///要将u的时间戳(是low,不是num)更新if(u != root && low[v] >= num[u]) ///如果u不是根节点,并且满足割点的条件flag[u] = 1;///如果u是根节点且孩子节点也有两个,那么根节点就是割点;///并且我们能证明出两个孩子节点一定不能通过若干结点中转相互到达;///假设能相互到达,那么这两个孩子节点一定不能共同车成为u的孩子节点,///因为一个孩子节点进行递归以后,会把该孩子节点能够连通且没有被访问的结点///进行访问;if(u == root && child == 2)flag[u] = 1;}///如果v已经被访问过且是u的祖宗节点(并不是父节点),则更新当前节点 u 能否///访问到最早顶点的时间戳;else if(v != fath)low[u] = min(low[u] , num[v]);}
}int main()
{int n,m;cin >> n >> m;for(int i=0;i<m;++i){int u,v;cin >> u >> v;Adj[u].push_back(v);Adj[v].push_back(u);}root = 1;dfs(1,root);for(int i=1;i<=n;++i)if(flag[i] == 1)cout << i << endl;return 0;
}
*/
2)割边:
满足割边的条件:子节点 v 不经过父节点 u 是不能达到u的祖宗节点的(也就是已经被访问
的那些节点);并且不能经过其点到达父节点;即:low[v] > num[u];
/**
2)割边:满足割边的条件:子节点 v 不经过父节点 u 是不能达到u的祖宗节点的(也就是已经被访问的那些节点);并且不能经过其点到达父节点;即:low[v] > num[u];
*//**dtta:6 61 41 34 23 22 55 6
*/#include <iostream>
#include <algorithm>
#include <vector>using namespace std;const int maxn = 1e5+10;
vector<int> Adj[maxn]; ///邻接表
int num[maxn] , low[maxn] ; ///时间戳、
int root , index; ///root为根节点,index为时间戳void dfs(int u,int fath) ///fath为u的父节点
{++index; ///时间戳加一num[u] = index;low[u] = index; ///最开始时间戳就是自己for(int i=0;i<Adj[u].size();++i){int v = Adj[u][i];if(num[v] == 0) ///如果v还没被访问过{dfs(v,u); ///递归low[u] = min(low[u] , low[v]); ///要将u的时间戳(是low,不是num)更新if(low[v] > num[u]) ///如果满足割边的条件printf("%d---->%d\n",u,v);}///如果v已经被访问过且是u的祖宗节点(并不是父节点),则更新当前节点 u 能否///访问到最早顶点的时间戳;else if(v != fath)low[u] = min(low[u] , num[v]);}
}int main()
{int n,m;cin >> n >> m;for(int i=0;i<m;++i){int u,v;cin >> u >> v;Adj[u].push_back(v);Adj[v].push_back(u);}root = 1;dfs(1,root);return 0;
}
求图的割点,割边(啊哈算法)相关推荐
- 20 求图的割点和割边—Tarjan算法
1 图的割点 问题描述 去掉2号城市,这样剩下的城市之间就不能两两相互到达.例如4号城市不能到5号城市,6号城市也不能到达1号城市等等. 下面将问题抽象化.在一个无向连通图中,如果删除某个顶点后,图不 ...
- tarjan算法 割点割边强联通 算法讲解模板 自用整理
很早就学过tarjan算法(割点割边与强联通)了,但是因为久不用老是忘,也有收藏过几篇不错的博客,但是每次需要时都要翻出那几篇太麻烦了,所以自己开篇记录方便自己的复习.图片和部分文字来源自其他博客,文 ...
- 图论学习--3 图的连通度(思维导图)割点 割边 块 连通度 连通度的性质
图的连通度 割边,割点,块 割边 图G删除e之后,连通分支变多 若G连通,删去割边之后,G不连通 定理1:e是G的割边当且仅当e不在G的任何圈中 由此可推论:e是连通图G的某圈中,则G-e仍然连通 必 ...
- 图的割点、桥与双连通分支
[点连通度与边连通度] 在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个连通块,就称这个点集为割点集合.一个图的点连通度的定义为,最小割点集 ...
- [转载]图的割点、桥与双连通分支
[点连通度与边连通度] 在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个连通块,就称这个点集为割点集合.一个图的点连通度的定义为,最小割点集 ...
- 图的割点 桥 双连通(byvoid)
[点连通度与边连通度] 在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个连通块,就称这个点集为割点集合.一个图的点连通度的定义为,最小割点集 ...
- 001.Tarjan算法:求解图的割点与桥(割边)
简介: 割边和割点的定义仅限于无向图中.我们可以通过定义以蛮力方式求解出无向图的所有割点和割边,但这样的求解方式效率低.Tarjan提出了一种快速求解的方式,通过一次DFS就求解出图中所有的割点和割边 ...
- Tarjan算法 (强联通分量 割点 割边)
变量解释: low 指当前节点在同一强连通分量(或环)能回溯到的dfn最小的节点 dfn 指当前节点是第几个被搜到的节点(时间戳) sta 栈 vis 是否在栈中 ans 指强连通分量的数量 top ...
- tarjan算法求无向图的割点和桥
tarjan算法求无向图的割点与桥 一篇tarjan算法求割点与桥的完整的解释,写的真的好认真 以下代码来自kuangbin的模板 4.5 图的割点.桥和双连通分支的基本概念 [点连通度与边连通度] ...
最新文章
- 《剑指offer》分解让复杂问题更简单
- EXCEL文件单独打开和单独关闭
- QT5.14搭建MSVC(VS2017) x86 以及64位编译器开发环境搭建(GDB配置)
- 2019ICPC(南昌) - The Nth Item(矩阵快速幂)
- 二、工作量证明链-区块链技术的雏形
- 用Java控制小电灯-树莓派PI4J
- 数据结构试卷(一)及答案
- 毕业设计php做个人网站,个人网站的设计与实现
- win10计算机上的策略禁止用户安装,win10电脑安装摄像头驱动时提示策略禁止安装此设备的解决教程...
- drcom运行在路由器上
- 利用IPHONE自带播放器播放视频
- 【基金量化研究系列】大类资产配置研究(一)——股债二八配置策略与股债风险平价策略
- 常说购买服务器,是购买安装linux系统还是windows系统,请问二者有啥区别
- 看房一次就租下的90后,大概都喜欢Q房网
- mac安装MongoDB与启动
- SpringCloudAlibaba踩坑日记(二)Relying upon circular references is discouraged and they are prohibited by
- 输入法编程指南(根据msdn翻译)
- Crypto++编译使用
- QNX系统下开启SSH服务步骤
- 金融数据中心环境下的SDN技术评测标准化思考与实践
热门文章
- java+criteriaquery_elasticsearch CriteriaQuery查询例子
- 爬取网站生成字典的常用工具:cewl
- delphi 经销商 英巴卡迪诺delphi代理
- open failed: EACCES(Permission denied)解决方法
- java捕鱼达人_java实现捕鱼达人游戏
- Android移植RIL库的过程
- Android安卓安全和隐私保护
- 基于Linux的Buildroot 制作根文件系统(rootfs)
- 【机器学习】树模型决策的可解释性与微调(Python)
- 香港服务器价格差距大的原因是什么