tarjan 复习笔记 割点与桥
定义分析
给定一个无向连通图\(G=(V,E)\)
对于\(x\in Y\),如果删去\(x\)及与\(x\)相连的边后,\(G\)分裂为两个或者两个以上的不连通子图,那么称\(x\)为\(G\)的割点
对于\((x,y)\in E\),如果删去\((x,y)\)后,\(G\)分裂为两个不连通的子图,那么就称\((x,y)\)为\(G\)的桥或者割边
一般无向图(不保证连通)的割点和桥 指的是各个连通块的割点和桥

在这个图中,\(1,6\)号结点为割点,\((1,6),(6,7)\)是桥
概念引入(Tarjan独特概念)
时间戳:对一张无向连通图进行DFS,使每个点只经过一遍,并且按照每个点第一次被访问的时间顺序依次标号(也就是他们的DFS序),这个标号被称为时间戳,记为\(dfs_x\).
搜索树:在时间戳形成的DFS过程中,我们发现所有构成递归的边构成了一棵树,称之为无向连通图的搜索树.
追溯值:设\(subtree(x)\)表示搜索树中以\(x\)为根的子树,节点\(u\)的追溯值我们定义为\(low_u\),定义为一下结点时间戳的最小值.
1、位于\(subtree(x)\)中的节点.
2、通过一条不在搜索树上的边,可以到达\(subtree(x)\)的节点.
构建方法(追溯值,时间戳)

第一次访问到一个节点\(x\)的时候,首先我们令\(low_x=dfn_x\).
然后,我们继续考虑与\(x\)相邻的每一条边,如果没有被访问过,那么就递归
地却访问他们,回溯是更新\(low_x\).如果\(y\in subtree(x)\),那么\(low_x=min(low_x,low_y)\).
否则\(low_x=min(low_x,dfn_y)\).
割点的判定
- 如果\(x\)不是搜索树上的根节点,那么\(x\)的割点判定条件为当且仅当搜索树上的一个子节点\(y\)满足
\]
解释:(请先理解好追溯值定义)这个公式表示的意思是在\(subtree(y)\)中的点如果不经过\(x\)那么就无法到达比\(x\)更早访问过的点。
特殊情况:如果\(x是根节点\),那么\(x\)是割点当且仅当搜索树上的两个子节点\(y\)满足上述条件时成立,表示这两个子节点无法互相到达
桥的判定
- 无向边\((x,y)\)是桥,当且仅当\((x,y)\),位于搜索树上,并且在搜索树上\(x\)的一个子节点\(y\)满足
\]
表示从\(subtree(y)\)出发,在不经过\((x,y)\)的前提下,无论是怎么走都无法到达\(x\)或者比\(x\)更早访问过的节点
当然,一个简单环里面的边一定不是桥,因为他是圈圈!!!
不在搜索树上的边至少都位于至少一个环中,因为不在搜索树上的边那么就表示它一定是连接到了已经被搜索过的点,所以当通过那个点的时候一定能在回到它本身,所以一定在至少一个环中
割点,桥判定代码
#include<cstdio>
#include<cstring>
#include<queue>
#include<stack>
#include<map>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=1e5+9;
struct node{
int last;
int to;
}e[N*2];
int head[N],vis[N],dfn[N],low[N],cut[N],cnt,poi,tot;
int n,m,root;
void add(int from,int to)
{
e[++cnt].last=head[from];
e[cnt].to=to;
head[from]=cnt;
}
void tarjan(int x)
{
dfn[x]=low[x]=++poi;
int flag=0;//根节点的判断
for(int i=head[x];i;i=e[i].last)
{
int v=e[i].to;
if(!dfn[v])//没有打时间戳说明未被搜索到过
{
tarjan(v);
low[x]=min(low[v],low[x]);
if(low[v]>=dfn[x])
{
flag++;
if(x!=root||flag>1)
{
cut[x]=1;
}
}
}
else low[x]=min(low[x],dfn[v]);
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int x,y;
cin>>x>>y;
if(x==y) continue;
add(x,y);
add(y,x);
}
for(int i=1;i<=n;i++)
{
if(!dfn[i])
{
root=i;
tarjan(i);
}
}
for(int i=1;i<=n;i++)
{
if(cut[i]) tot++;
}
cout<<tot<<endl;
for(int i=1;i<=n;i++)
{
if(cut[i]) cout<<i<<" "; //输出割点
}
return 0;
}```
```void tarjan(int x, int in_edge) //求桥
{
dfn[x] = low[x] = ++num;
for (int i = head[x]; i; i = Next[i]) {
int y = ver[i];
if (!dfn[y]) {
tarjan(y, i);
low[x] = min(low[x], low[y]);
if (low[y] > dfn[x])
bridge[i] = bridge[i ^ 1] = true;
}
else if (i != (in_edge ^ 1))
low[x] = min(low[x], dfn[y]);
}
}
tarjan 复习笔记 割点与桥的更多相关文章
- Tarjan无向图的割点和桥(割边)全网详解&算法笔记&通俗易懂
更好的阅读体验&惊喜&原文链接 感谢@yxc的腿部挂件 大佬,指出本文不够严谨的地方,万分感谢! Tarjan无向图的割点和桥(割边) 导言 在掌握这个算法前,咱们有几个先决条件. [ ...
- tarjan复习笔记
tarjan复习笔记 (关于tarjan读法,优雅一点读塔洋,接地气一点读塔尖) 0. 连通分量 有向图: 强连通分量(SCC)是个啥 就是一张图里面两个点能互相达到,那么这两个点在同一个强连通分量里 ...
- 学习笔记--Tarjan算法之割点与桥
前言 图论中联通性相关问题往往会牵扯到无向图的割点与桥或是下一篇博客会讲的强连通分量,强有力的\(Tarjan\)算法能在\(O(n)\)的时间找到割点与桥 定义 若您是第一次了解\(Tarjan\) ...
- Tarjan求无向图割点、桥详解
tarjan算法--求无向图的割点和桥 一.基本概念 1.桥:是存在于无向图中的这样的一条边,如果去掉这一条边,那么整张无向图会分为两部分,这样的一条边称为桥无向连通图中,如果删除某边后,图变成不 ...
- tarjan复习笔记 双连通分量,强连通分量
声明:图自行参考割点和桥QVQ 双连通分量 如果一个无向连通图\(G=(V,E)\)中不存在割点(相对于这个图),则称它为点双连通图 如果一个无向连通图\(G=(V,E)\)中不存在割边(相对于这个图 ...
- 求无向图的割点和桥模板(tarjan)
一.基本概念 1.桥:若无向连通图的边割集中只有一条边,则称这条边为割边或者桥 (离散书上给出的定义.. 通俗的来说就是无向连通图中的某条边,删除后得到的新图联通分支至少为2(即不连通: 2.割点:若 ...
- 割点和桥---Tarjan算法
使用Tarjan算法求解图的割点和桥. 1.割点 主要的算法结构就是DFS,一个点是割点,当且仅当以下两种情况: (1)该节点是根节点,且有两棵以上的子树; (2)该节 ...
- Tarjan应用:求割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)【转】【修改】
一.基本概念: 1.割点:若删掉某点后,原连通图分裂为多个子图,则称该点为割点. 2.割点集合:在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成 ...
- (转)Tarjan应用:求割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)
基本概念: 1.割点:若删掉某点后,原连通图分裂为多个子图,则称该点为割点. 2.割点集合:在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个 ...
随机推荐
- easyui中开始时间小于结束时间 不然无法点击
<tr> <td align="right">用药开始时间:</td> <td><input id="time_fr ...
- 将从数据库查询出来的带有父子结构的list转换成treeList结构
package test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedSta ...
- Linux嵌入式学习-烟雾传感器驱动-字符设备驱动-按键驱动
MQ-2烟雾气敏传感器模块在X210v3开发板上的驱动. 现在需要一个MQ-2烟雾气敏传感器模块的驱动.其检测烟雾超过一定的标准后,会返回一个不同的电平,和按键驱动差不多. 但是在编写驱动的时候,需要 ...
- 如何理解java枚举,看例子
先来看一下不用枚举怎么表示常量: //常量类 class Num { public static String ONE = "ONE"; public static String ...
- Mac电脑远程连接SSH Host key verification failed 解决办法
苹果电脑远程连接SSH出现如下问题: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ...
- webservcie学习之webservice是什么
之前写代码,只是用到的时候才去看相关技术,用过后也没有再回头特别 去看,现在突然发现对一些技术的了解不够深刻,故现在准备再从头对用到的技术深入的学习下.就从webservice开始.首先对我不解的地方 ...
- 伯俊BOS2.0关于订金单的处理方案
订金单功能调整设计 一. 功能确认 BPOS关于订金的使用对应的是"预收单",原"预收单"设置有商品明细,根据客户对订金的需求,取消原有"商品 ...
- 茅坑杀手与Alias Method离散采样
说起Alias,你可能第一个联想到的是Linux中的Alias命令,就像中世纪那些躲在茅坑下面(是真的,起码日本有粪坑忍者,没有马桶的年代就是社会的噩梦)进行刺杀的杀手一样,让人防不胜防,对于那些被这 ...
- 熬夜肝了一周!总结了这套对标阿里P8的java秘籍,限时发布3天!
前言 最近老是有粉丝私信我说感觉自己学java越来越难了,这其中有刚毕业的应届生说自己的技术找不到满意的工作,也有在学校的大学习说找不到学习方式,更多的是正在工作的java开发人员说是现在的技术更新太 ...
- 图解SparkStreaming与Kafka的整合,这些细节大家要注意!
前言 老刘是一名即将找工作的研二学生,写博客一方面是复习总结大数据开发的知识点,一方面是希望帮助更多自学的小伙伴.由于老刘是自学大数据开发,肯定会存在一些不足,还希望大家能够批评指正,让我们一起进步! ...