by   GeneralLiu

tarjan 求 割点 割边

无向图  的 割点 割边:

对于无向连通图来说,
  如果删除   一个点以及与它相连的边   之后,
    使得这个图不连通,
    那么该点为割点 ;
  如果删除 一条边 之后 ,
    使得这个图不连通,
    那么该边为割边 ;

 

tarjan 是基于 dfs树 的算法

所以, dfs树 上的一些 术语有必要知道 一下

so  看我 博客

与 有向图的tarjan算法 非常类似

割边 的 求法 (这个一步就判断出来,先写容易的):

  在 dfs树 上 后向边 一定不是 割边

    如果是 树边(from u,to v) // 对应 下文 代码 20 行

      且  low [ v ] > dfn [ u ]  // 对应 下文 代码 24,25 行

      则 是割边

在 无向图 这里 边的类型只有这两种(没有横叉边与前向边)

割点 的 求法 :

  如果是 dfs树 的 根节点

    且 有不止一个儿子 则 是割点   // 对应 下文 代码 33,34 行

  不是根

    如果 u 存在子节点 v   // 对应 下文 代码 28,29 行

      使 low[v] >= dfn[u]

      那么u为割点

代码

与 有向图的tarjan代码 非常类似

 #include<iostream>
#include<cstdio>
using namespace std;
#define N 1000
#define M 2000
int dfn[N],low[N],cnt,n,m,head[N],to[M],next[M];
bool cutnode[N],cutedge[M];
void add(int x,int y){
next[++cnt]=head[x];
to[cnt]=y;
head[x]=cnt;
}
void dfs(int fa,int u){
dfn[u]=low[u]=++cnt;
int v,ch=;
bool b=;
for(int i=head[u];i;i=next[i]){
v=to[i];
if(v==fa)continue;
if(!dfn[v]){ // 树边
ch++;
dfs(u,v);
low[u]=min(low[u],low[v]);
if(low[v]>dfn[u]) // 判断 割边
cutedge[(i+)>>]=; // 无向图边存了两遍 如此来定位 边的编号
}
else low[u]=min(low[u],dfn[v]);
if(low[v]>=dfn[u]) // 判断 割点
b=;
}
if(dfn[u]!=) // 讨论 u 是否 为根 分别处理
cutnode[u]=b;
else if(ch>=)
cutnode[u]=;
}
int main(){
scanf("%d%d",&n,&m);
for(int x,y,i=;i<=m;i++){
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
}
for(int i=;i<=n;i++)
if(!dfn[i])
cnt=,dfs(,i);
for(int i=;i<=n;i++) // 输出 割点
if(cutnode[i])
printf("%d ",i);
printf("\n");
for(int i=;i<=m;i++) // 输出 割边
if(cutedge[i])
printf("%d ",i);
return ;
}

tarjan 割点 割边的更多相关文章

  1. Tarjan 割点割边【模板】

    #include <algorithm> #include <cstring> #include <cstdio> using namespace std; +); ...

  2. 【学习整理】Tarjan:强连通分量+割点+割边

    Tarjan求强连通分量 在一个有向图中,如果某两点间都有互相到达的路径,那么称中两个点强联通,如果任意两点都强联通,那么称这个图为强联通图:一个有向图的极大强联通子图称为强联通分量.   算法可以在 ...

  3. 求割点 割边 Tarjan

    附上一般讲得不错的博客 https://blog.csdn.net/lw277232240/article/details/73251092 https://www.cnblogs.com/colle ...

  4. tarjan求割边割点

    tarjan求割边割点 内容及代码来自http://m.blog.csdn.net/article/details?id=51984469 割边:在连通图中,删除了连通图的某条边后,图不再连通.这样的 ...

  5. Tarjan算法 (强联通分量 割点 割边)

    变量解释: low 指当前节点在同一强连通分量(或环)能回溯到的dfn最小的节点 dfn 指当前节点是第几个被搜到的节点(时间戳) sta 栈 vis 是否在栈中 ans 指强连通分量的数量 top ...

  6. Tarjan算法与割点割边

    目录 Tarjan算法与无向图的连通性 1:基础概念 2:Tarjan判断割点 3:Tarjan判断割边 Tarjan算法与无向图的连通性 1:基础概念 在说Tarjan算法求解无向图的连通性之前,先 ...

  7. 图的连通性——Tarjan算法&割边&割点

    tarjan算法 原理: 我们考虑 DFS 搜索树与强连通分量之间的关系. 如果结点 是某个强连通分量在搜索树中遇到的第⼀个结点,那么这个强连通分量的其余结点肯定 是在搜索树中以 为根的⼦树中. 被称 ...

  8. {part2}DFN+LOW(tarjan)割边

    首先非树边肯定不是割边,因为去掉它DFS树不受影响,只要还能生成一棵DFS树那么图就是连通的. 然后割掉一条树边只可能造成一个点与它的父亲不连通. 那好办,也就是说这个以这个点为根的子树就是上面所说的 ...

  9. 【NOIP训练】【Tarjan求割边】上学

    题目描述 给你一张图,询问当删去某一条边时,起点到终点最短路是否改变. 输入格式 第一行输入两个正整数,分别表示点数和边数.第二行输入两个正整数,起点标号为,终点标号为.接下来行,每行三个整数,表示有 ...

随机推荐

  1. 题解报告:poj 2559 Largest Rectangle in a Histogram(单调栈)

    Description A histogram is a polygon composed of a sequence of rectangles aligned at a common base l ...

  2. xml小练习

    挑选你熟悉省份,制作xml城市列表 ----- 必备城市基本信息 10个城市 --- 一定要有属性对城市列表 添加DTD约束 <?xml version="1.0" enco ...

  3. Android偏好设置(1)概述和Preferences简介

    1.Overview Instead of using View objects to build the user interface, settings are built using vario ...

  4. javascript:void(0)与#区别

    javascript:void(0)   鼠标点击时,不会跳转到其他页面,且停留在原地 #   鼠标点击时,不会跳转到其他页面,但会回到顶部

  5. Nuget 自定义配置(官网)

    <?xml version="1.0" encoding="utf-8"?> <configuration> <config> ...

  6. Java socket2

    通过socket对象可以获取通信对方的socket信息 客户端: import java.net.*; import java.io.*; public class TestServer { publ ...

  7. win7 系统 右键很慢

    一般都是显卡驱动造成的, 在桌面按右键反应慢,通常都是显卡驱动程序惹的祸,最最简单有效的办法就是:开始--运行--. 运行regsvr32 /u igfxpph.dll

  8. Nginx server_name 正则泛域名反向代理两例

    最近在学习Nginx搭建负载均衡系统,感觉系统部署方式的思路瞬间开阔了很多. 负载均衡服务器的后端服务器上各自有一套功能相同的WEB管理系统,主要作用是方便的对各自服务器的IIS站点及服务器防火墙测量 ...

  9. 重装系统后,重新搭建Selenium Server+Firefox环境

    摘要:搭建Selenium自动化测试环境其实是非常简单的事情,在态度上我们不要把它当成难事:折腾起来是很愉快的,自然就成功了. 下面把这次安装的过程记录下来,一来是加深印象,二来可以给大家提供参考. ...

  10. WindowsService+Quartz.NET快速搭建

    新建一个Windows服务项目 nuget安装Quartz.NET,我这边使用的是2.3.3版本 1. Service改名 2. 添加安装程序,改名 3. ServiceInstaller->属 ...