割点和桥的模板(割点和割边)
(1)割点与桥(割边)的定义(只存在于无向图)
割点:无向连通图中,去掉一个顶点及和它相邻的所有边,图中的连通分量数增加,则该顶点称为割点。
桥(割边):无向联通图中,去掉一条边,图中的连通分量数增加,则这条边,称为桥或者割边。
(2)割点与桥(割边)的关系
有割点不一定有桥,有桥一定存在割点;桥一定是割点依附的边。
(3)判断是否为割点
情况1:该点为根节点,那只要子节点数目超过1,那就是割点。
情况2:如果该点不为根节点,那只要这个节点的子节点不能够到达祖节点,那也是割点。
(4)判断是否为割边
只有满足此点有父亲节点并且不能回到自己的祖先。
(1)(求割点的模板)
题目描述
给出一个n个点,m条边的无向图,求图的割点。
输入格式
第一行输入n,m。下面m行每行输入x,y表示x到y有一条边
输出格式
第一行输出割点个数
第二行按照节点编号从小到大输出节点,用空格隔开
输入输出样例
输入
6 7
1 2
1 3
1 4
2 5
3 5
4 5
5 6
输出
1
5
(割点模板)代码:
#include<stdio.h> #include<string.h> #define N 200010 #define M 20005 #include<algorithm> using namespace std; int net[N],first[M],to[N];//邻接表数组 int low[M],dfn[M],w[M],h[M];//tanjar数组 int n,m,x,y,cnt,num,cot;//需要用的变量 void init() {cnt=1,num=0,cot=0;memset(first,-1,sizeof(first));memset(dfn,0,sizeof(dfn));memset(low,0,sizeof(low));memset(w,0,sizeof(w)); } void build_bian(int x,int y)//用邻接表双向建边 {to[cnt]=y;net[cnt]=first[x];first[x]=cnt++; } void tarjan(int x,int root,int father)//分别表示当前节点,根节点,父亲节点。 {low[x]=dfn[x]=++num;int child=0;for(int i=first[x]; i!=-1; i=net[i]){child++;//记录根节点的子节点数目。int k=to[i];if(dfn[k]==0)//表示k点没有被访问过{tarjan(k,root,x);low[x]=min(low[x],low[k]);if(x==root&&child>1)//如果该点为根节点且还2个及以上的子节点w[cot++]=x;if(x!=root&&low[k]>=dfn[x])//如果该子节点不能到达祖先节点w[cot++]=x;}else if(k!=father)//防止回到父亲节点low[x]=min(low[x],dfn[k]);} } int main() {while(~scanf("%d%d",&n,&m)){init();for(int i=1; i<=m; i++){scanf("%d%d",&x,&y);build_bian(x,y);build_bian(y,x);}for(int i=1; i<=n; i++)if(dfn[i]==0)tarjan(i,i,i);sort(w,w+cot);w[cot]=-1;int sum=0;for(int i=0; i<cot; i++)if(w[i]!=w[i+1])h[sum++]=w[i];printf("%d\n",sum);for(int i=0; i<sum; i++)printf("%d ",h[i]);printf("\n");} }
(2)(求割边的模板)
题目描述
因为某国被某红色政权残酷的高压暴力统治。美国派出将军uim,对该国进行战略性措施,以解救涂炭的生灵。
该国有n个城市,这些城市以铁路相连。任意两个城市都可以通过铁路直接或者间接到达。
uim发现有些铁路被毁坏之后,某两个城市无法互相通过铁路到达。这样的铁路就被称为key road。
uim为了尽快使该国的物流系统瘫痪,希望炸毁铁路,以达到存在某两个城市无法互相通过铁路到达的效果。
然而,只有一发炮弹(美国国会不给钱了)。所以,他能轰炸哪一条铁路呢?
输入格式
第一行n,m(1<=n<=150, 1<=m<=5000),分别表示有n个城市,总共m条铁路。
以下m行,每行两个整数a, b,表示城市a和城市b之间有铁路直接连接。
输出格式
输出有若干行。
每行包含两个数字a,b(a<b),表示<a,b>是key road。
请注意:输出时,所有的数对<a,b>必须按照a从小到大排序输出;如果a相同,则根据b从小到大排序。
输入输出样例
输入
6 6
1 2
2 3
2 4
3 5
4 5
5 6
输出
1 2
5 6
(割桥模板)代码:
#include<stdio.h> #include<string.h> #define N 200 #define M 12000 #include<algorithm> using namespace std; int low[N],dfn[N];//tanjar数组 int first[N],net[M],to[M];//邻接表数组 int n,m,num,cnt,cot,fa[N];//需要用的变量 struct node {int x,y; } q[M]; bool cmp(node a,node b) {if(a.x==b.x)return a.y<b.y;return a.x<b.x; } void build_bian(int x,int y)//用邻接表双向建边 {to[cnt]=y;net[cnt]=first[x];first[x]=cnt++; } void init() {cnt=1,num=0,cot=0;memset(fa,0,sizeof(fa));memset(dfn,0,sizeof(dfn));memset(first,-1,sizeof(first));memset(low,0,sizeof(low)); } void tarjan(int x,int father)//分别表示当前节点,父亲节点。 {low[x]=dfn[x]=++num;fa[x]=father;//记录当前节点和父节点的关系for(int i=first[x]; i!=-1; i=net[i]){int k=to[i];if(dfn[k]==0)//表示k点没有被访问过{tarjan(k,x);low[x]=min(low[x],low[k]);}else if(k!=father)//防止回到父亲节点low[x]=min(low[x],dfn[k]);} } int main() {init();scanf("%d%d",&n,&m);for(int i=1; i<=m; i++){int x,y;scanf("%d%d",&x,&y);build_bian(x,y);build_bian(y,x);}for(int i=1; i<=n; i++)if(dfn[i]==0)tarjan(i,0);for(int i=1; i<=n; i++)if(fa[i]&&low[i]>dfn[fa[i]])//只有满足此点有父亲节点并且不能回到自己的祖先。{if(i>fa[i])q[cot].x=fa[i],q[cot++].y=i;elseq[cot].x=i,q[cot++].y=fa[i];}sort(q,q+cot,cmp);q[cot].x=-1,q[cot].y=-1;for(int i=0; i<cot; i++)printf("%d %d\n",q[i].x,q[i].y);printf("\n"); }
割点和桥的模板(割点和割边)相关推荐
- tarjan求割点和桥(割边)模板
tanjan算法相关概念 为了与有向图尽可能保持一致,我们将无向图的一条无向边拆分成两条单向边.两条边互为反向边. 从图中一点作为起点,进行DFS搜索遍历图,这样会得到一棵树,我们称之为DFS搜索树, ...
- 模板:割点、桥与双连通
文章目录 割点 代码 桥 点双连通分量 代码 边双连通分量 代码 割点 和强连通分量十分相似 分为树枝边.前向边和后向边 注意! if(x!=r&&low[to]>=dfn[x] ...
- tarjan求割点和桥(割边)
tarjan求割点和桥 参考博客:tarjan求割点和桥(割边) 例题:割点 代码(重要的地方在代码中都有注释): #include<bits/stdc++.h> #define ll l ...
- 001.Tarjan算法:求解图的割点与桥(割边)
简介: 割边和割点的定义仅限于无向图中.我们可以通过定义以蛮力方式求解出无向图的所有割点和割边,但这样的求解方式效率低.Tarjan提出了一种快速求解的方式,通过一次DFS就求解出图中所有的割点和割边 ...
- tarjan算法 (割点和桥)
最近刚学习了tarjan算法,发一篇博客写一下自己的心得和理解. 在了解割点和桥之前,我们先理解什么是双连通. 双连通和强连通分别是应用于无向图和有向图中的,那么在学习双连通之前,请自行学习求强连通分 ...
- 快乐地打牢基础(5)——割点和桥
一.定义 割点集合: 在一个无向连通图中,如果有一个顶点集合V,删除顶点集合V以及与V中顶点相连(至少有一端在V中)的所有边之后,原图不连通,就称这个点为割点集合. 一个图的点连通度: 最小割点集合的 ...
- tarjan算法求无向图的割点和桥
tarjan算法求无向图的割点与桥 一篇tarjan算法求割点与桥的完整的解释,写的真的好认真 以下代码来自kuangbin的模板 4.5 图的割点.桥和双连通分支的基本概念 [点连通度与边连通度] ...
- 图论之tarjan真乃神人也,强连通分量,割点,桥,双连通他都会
先来%一下Robert Tarjan前辈 %%%%%%%%%%%%%%%%%% 然后是热情感谢下列并不止这些大佬的博客: 图连通性(一):Tarjan算法求解有向图强连通分量 图连通性(二):Tarj ...
- 图的割点、桥与双连通分支
[点连通度与边连通度] 在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个连通块,就称这个点集为割点集合.一个图的点连通度的定义为,最小割点集 ...
最新文章
- 团队开发项目-NABCD模型
- centos6.6上安装beef
- AD属性修改 office 365 delivery management 设定
- mysql denide_MYSQL 出现Error1045 access denied 的解决方法
- 我,宇宙最强编辑器,支持远程开发
- GDOI2018-《被虐记》
- 《TCP/IP详解》学习笔记(一):基本概念
- javescript的内置对象
- mysql安装设置mysql字符集utf8及修改密码
- html可以用坐标画svg图吗,HTML5如何使用SVG的方法示例
- “考虑对方的感受”之案例
- 分库分表 vs NewSQL,怎么选择?
- 基于PC-DIMS脱机软件 的海克斯康三坐标机脱机编程软件手册。
- Affinity Photo for Mac中文破解版永久激活方法
- 9点EXCEL计算公式
- HBase学习-----javaAPI详细教程
- 关于StringTokenizer的用法
- 系统程序员成长计划-管道过滤器(Pipe-And-Filter)模式
- 普通开普勒式望远镜光学设计1-初始结构设计选型与物镜像差校正
- 生活指南:IT人士健康生活应多吃的几种食物
热门文章
- PKIX问题:sun.security.validator.ValidatorException: PKIX path building failed
- Google在线的Python神器colab
- Mastering Algorithms with C(dlist)
- 利用threading库实现python多线程以多线程音频实时输入为例
- Js的次方(幂)表示方法:基数 **指数 或 Math.pow(基数,指数)
- 医学遗传学词汇英语术语英文(Glossary) 1
- 破世界纪录了!用Python实现自动扫雷
- 5.sklearn之转换器(划分训练集和测试集、以及标准化、归一化数据会用transform,独热编码也会用到)
- 容量影响计算机性能嘛,内存条会影响电脑性能吗?
- 客户端自动化技术漫谈