(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");
}

割点和桥的模板(割点和割边)相关推荐

  1. tarjan求割点和桥(割边)模板

    tanjan算法相关概念 为了与有向图尽可能保持一致,我们将无向图的一条无向边拆分成两条单向边.两条边互为反向边. 从图中一点作为起点,进行DFS搜索遍历图,这样会得到一棵树,我们称之为DFS搜索树, ...

  2. 模板:割点、桥与双连通

    文章目录 割点 代码 桥 点双连通分量 代码 边双连通分量 代码 割点 和强连通分量十分相似 分为树枝边.前向边和后向边 注意! if(x!=r&&low[to]>=dfn[x] ...

  3. tarjan求割点和桥(割边)

    tarjan求割点和桥 参考博客:tarjan求割点和桥(割边) 例题:割点 代码(重要的地方在代码中都有注释): #include<bits/stdc++.h> #define ll l ...

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

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

  5. tarjan算法 (割点和桥)

    最近刚学习了tarjan算法,发一篇博客写一下自己的心得和理解. 在了解割点和桥之前,我们先理解什么是双连通. 双连通和强连通分别是应用于无向图和有向图中的,那么在学习双连通之前,请自行学习求强连通分 ...

  6. 快乐地打牢基础(5)——割点和桥

    一.定义 割点集合: 在一个无向连通图中,如果有一个顶点集合V,删除顶点集合V以及与V中顶点相连(至少有一端在V中)的所有边之后,原图不连通,就称这个点为割点集合. 一个图的点连通度: 最小割点集合的 ...

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

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

  8. 图论之tarjan真乃神人也,强连通分量,割点,桥,双连通他都会

    先来%一下Robert Tarjan前辈 %%%%%%%%%%%%%%%%%% 然后是热情感谢下列并不止这些大佬的博客: 图连通性(一):Tarjan算法求解有向图强连通分量 图连通性(二):Tarj ...

  9. 图的割点、桥与双连通分支

    [点连通度与边连通度] 在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个连通块,就称这个点集为割点集合.一个图的点连通度的定义为,最小割点集 ...

最新文章

  1. 团队开发项目-NABCD模型
  2. centos6.6上安装beef
  3. AD属性修改 office 365 delivery management 设定
  4. mysql denide_MYSQL 出现Error1045 access denied 的解决方法
  5. 我,宇宙最强编辑器,支持远程开发
  6. GDOI2018-《被虐记》
  7. 《TCP/IP详解》学习笔记(一):基本概念
  8. javescript的内置对象
  9. mysql安装设置mysql字符集utf8及修改密码
  10. html可以用坐标画svg图吗,HTML5如何使用SVG的方法示例
  11. “考虑对方的感受”之案例
  12. 分库分表 vs NewSQL,怎么选择?
  13. 基于PC-DIMS脱机软件 的海克斯康三坐标机脱机编程软件手册。
  14. Affinity Photo for Mac中文破解版永久激活方法
  15. 9点EXCEL计算公式
  16. HBase学习-----javaAPI详细教程
  17. 关于StringTokenizer的用法
  18. 系统程序员成长计划-管道过滤器(Pipe-And-Filter)模式
  19. 普通开普勒式望远镜光学设计1-初始结构设计选型与物镜像差校正
  20. 生活指南:IT人士健康生活应多吃的几种食物

热门文章

  1. PKIX问题:sun.security.validator.ValidatorException: PKIX path building failed
  2. Google在线的Python神器colab
  3. Mastering Algorithms with C(dlist)
  4. 利用threading库实现python多线程以多线程音频实时输入为例
  5. Js的次方(幂)表示方法:基数 **指数 或 Math.pow(基数,指数)
  6. 医学遗传学词汇英语术语英文(Glossary) 1
  7. 破世界纪录了!用Python实现自动扫雷
  8. 5.sklearn之转换器(划分训练集和测试集、以及标准化、归一化数据会用transform,独热编码也会用到)
  9. 容量影响计算机性能嘛,内存条会影响电脑性能吗?
  10. 客户端自动化技术漫谈