在无向连通图中,如果将其中一个点以及所连的所有边都删掉,图就不再连通的话,那么这个点就叫做割点

首先将所有的点分为:1.环中点 2.不成环的单点
割点一般出现的情况是:如果(处在不同环中/一环一单点/均为单点)的两点相连,那么这两点都是割点

与tarjan求强连通分量相同,引入dfn时间戳和low
dfn意义还是记录遍历序号
low意义为记录自己当前点所在环的最先遍历的点的dfn,那么对于两个不同的环(或不成环的点)而言,他们low值一定不同

下面分析判断割点:
如图,走dfs序,root黑色根节点最先进入,走了一圈又回到黑色节点,那么回溯过程做两件事:a.与黑色节点相邻的X, Low[X]=Dfn(黑)=low0, b.红色节点Low(红)=Low[X]=low0,然后红色节点分三路,三路回溯完后:
1.研究红蓝节点有low0<low1,那么回溯到红色节点时,一定会出现Dfn(红)<Dfn(蓝)=Low(蓝),此时标记红节点。
2.而红节点本身的环内节点回溯只会是Dfn(红)>Dfn(X)=low0。
3.那么蓝点其实也是割点,他什么时候被标记呢?回答:走自己蓝环时就要被标记,也就是说蓝环内部回溯到蓝点时,会出现Dfn(蓝)=Low(Y)=low1,这时标记蓝点。

总结下:
对于一个根节点:
如果有两颗以上的子树那么就是割点,(且注意红环回溯到黑点时,黑点不能通过Dfn(黑)=Low(红)=low0打标记)
对于非根节点:
综合上面123条,如果回溯满足 Dfn(u)<=Low(v),那么就把u打上标记即可。

上代码:(对于多个连通图的一般情况代码)

bool cut[N]//标记割点
int child=;//记录主根root有几个子树
void tarjan(int u,int fa){ //有fa是对于多连通图问题
dfn[u]=low[u]=idx++;
int child=;
for(i,fi[u],nx){
int v=e[i].to;
if(!dfn[v]){
tarjan(v,fa);
chkmin(low[u],low[v]);
if(low[v]>=dfn[u]&&u!=fa)cut[u]=;//打标记
if(u==fa)child++;
}
chkmin(low[u],dfn[v]);//管你以前遍历过没,如果遇到遍历过的点,那就相当于形成环了,那么更新dfn,而不是更新low,小心环套环情况
}
if(child>=&&u==fa)cut[u]=;
} For(i,,n)
if(!dfn[i])tarjan(i,i);
For(i,,n)
if(cut[i])ans++;

tarjan 求割点的更多相关文章

  1. UESTC 900 方老师炸弹 --Tarjan求割点及删点后连通分量数

    Tarjan算法. 1.若u为根,且度大于1,则为割点 2.若u不为根,如果low[v]>=dfn[u],则u为割点(出现重边时可能导致等号,要判重边) 3.若low[v]>dfn[u], ...

  2. POJ 1144 Network(Tarjan求割点)

    Network Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 12707   Accepted: 5835 Descript ...

  3. poj 1523 SPF(tarjan求割点)

    本文出自   http://blog.csdn.net/shuangde800 ------------------------------------------------------------ ...

  4. poj_1144Network(tarjan求割点)

    poj_1144Network(tarjan求割点) 标签: tarjan 割点割边模板 题目链接 Network Time Limit: 1000MS Memory Limit: 10000K To ...

  5. 洛谷P3388 【模板】割点(割顶)(tarjan求割点)

    题目背景 割点 题目描述 给出一个n个点,m条边的无向图,求图的割点. 输入输出格式 输入格式: 第一行输入n,m 下面m行每行输入x,y表示x到y有一条边 输出格式: 第一行输出割点个数 第二行按照 ...

  6. [POJ1144][BZOJ2730]tarjan求割点

    求割点 一种显然的n^2做法: 枚举每个点,去掉该点连出的边,然后判断整个图是否联通 用tarjan求割点: 分情况讨论 如果是root的话,其为割点当且仅当下方有两棵及以上的子树 其他情况 设当前节 ...

  7. poj1144 tarjan求割点

    poj1144 tarjan求割点 额,算法没什么好说的,只是这道题的读入非常恶心. 注意,当前点x是否是割点,与low[x]无关,只和low[son]和dfn[x]有关. 还有,默代码的时候记住分目 ...

  8. tarjan求割点割边的思考

    这个文章的思路是按照这里来的.这里讨论的都是无向图.应该有向图也差不多. 1.如何求割点 首先来看求割点.割点必须满足去掉其以后,图被分割.tarjan算法考虑了两个: 根节点如果有两颗及以上子树,它 ...

  9. Tarjan求割点和桥

    by szTom 前置知识 邻接表存储及遍历图 tarjan求强连通分量 割点 割点的定义 在一个无向图中,如果有一个顶点集合,删除这个顶点集合以及这个集合中所有顶点相关联的边以后,图的连通分量增多, ...

  10. tarjan求割点与割边

    tarjan求割点与割边 洛谷P3388 [模板]割点(割顶) 割点 解题思路: 求割点和割点数量模版,对于(u,v)如果low[v]>=dfn[u]那么u为割点,特判根结点,若根结点子树有超过 ...

随机推荐

  1. org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException Line 47 in

    org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 47 in XML document from ...

  2. oop(Object Oriented Programming)

    嗯,昨天忙了一天没来及发,过年啊,打扫啊,什么搽窗户啊,拖地啊,整理柜子啊,什么乱七八糟的都有,就是一个字,忙. 好了,废话也不多说,把自己学到的放上来吧.嗯,说什么好呢,就说原型链啊 原型对象 每个 ...

  3. easyui+webuploader+ckeditor实现插件式多图片上传

    需求:在ckeditor编辑器上实现多图片上传并要求另外单独选择ckeditor上传的图片作为封面 页面效果说明: 动态效果图: 第一步:页面布局 <html xmlns="http: ...

  4. ionic之angular1.X缓存问题解决

    众所周知ionic的angular1.X解决缓存的问题有: 1.在app.js里面修改:默认是true,设置了缓存 .state('tab.msg-main', { url: '/msg-main', ...

  5. python turtle 绘制图像

    def _circle(): t = turtle.Turtle() t.pencolor("yellow") t.pensize(5) t.speed(200) t.circle ...

  6. C# WinForm中添加用户控件

    转:https://blog.csdn.net/haelang/article/details/40681003 有的时候我们需要频繁使用一些系统默认工具的组合,那么就可以使用自定义用户控件. 起一个 ...

  7. AForge.NET简介

    AForge.NET是一个专门为开发者和研究者基于C#框架设计的,这个框架提供了不同的类库和关于类库的资源,还有很多应用程序例子,包括计算机视觉与人工智能,图像处理,神经网络,遗传算法,机器学习,机器 ...

  8. 如何将同一云服务下的虚拟机从经典部署模型迁移到 Azure Resource Manager

    适用场景 用户希望将特定云服务下的所有虚拟机从经典部署模型(以下简称:ASM)迁移到 Azure Resource Manager(以下简称:ARM). Note 如果云服务下使用 VNET 也希望将 ...

  9. Spine Skeleton Animation(2D骨骼动画)

    骨骼动画 首先我们来看到底什么是骨骼动画: 在早期的机器上,渲染本身已经占用了很多CPU资源,因此,对于渲染,往往采取的是一种空间换时间的策略,以避免在模型的渲染中继续加重CPU的负担.帧动画模型在这 ...

  10. ODS设计

    1.数据调研 2.确定数据范围 需要把上端应用需求与ODS数据范围进行验证,以确保应用所需的数据都已经从业务系统中抽取出来,并且得到了很好的组织,以ER模型表示数据主题关系 3.根据数据范围进行进一步 ...