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. Tree Recovery POJ - 2255

    Tree Recovery POJ - 2255 根据树的前序遍历和中序遍历还原后序遍历. (偷懒用了stl的find) #include<iostream> #include<st ...

  2. Android 内存溢出处理方案

    转自 : http://www.cnblogs.com/hello-ruby/archive/2013/04/19/3031098.html 首先我们来看看android内存溢出的原因,有可能是: 由 ...

  3. AJPFX关于异常和file类的总结

    /** * 各位坛友注意啦!对我这个帖子有任何的疑惑的,可以尽管留帖提问,我会在看到的第一时间回贴,既然写得出这帖子,* 就要对看这帖子的人负责,所以有问题,尽管问!* * * 这块没学好的同学,可以 ...

  4. hihocoder offer收割编程练习赛12 D 寻找最大值

    思路: 可能数据太水了,随便乱搞就过了. 实现: #include <iostream> #include <cstdio> #include <algorithm> ...

  5. ReactJS-3-组件生命周期

    简介 普通的UI应用生命周期一般包括Birth, Growth, Death, React中Component的生命周期也是如此,这是一个持续的过程,贯穿整个应用的生命历程. 阶段 1.mountin ...

  6. 开发小Tips

    Kotlin语言篇: 1.抽象类的定义 abstract class Person(var name : String, var age : Int) : Any() { abstract var a ...

  7. [经典面试题]包含T全部元素的最小子窗口

    题目描述 给定一个包含一系列字符的集合T和字符串S,请在字符串S中找到一个最小的窗口,这个窗口中必须包含T中的所有字符.  例如,  S = "ADOBECODEBANC"  T ...

  8. PHP运算符考察点

    PHP运算符优先级 运算符优先级指定了两个表达式绑定得有多"紧密".例如,表达式 1 + 5 * 3 的结果是 16 而不是 18 是因为乘号(*)的优先级比加号(+)高.必要时可 ...

  9. Mac OS X 中安装 brew

    不想被误导?直接看官方文档:   http://mxcl.github.com/homebrew/    先安装Git,打开一个shell cd /usr/local sudo mkdir homeb ...

  10. 07CSS表格

    CSS表格 表格边框 如需在 CSS 中设置表格边框,请使用 border 属性. table, th, td { border: 1px solid blue; } 折叠边框 border-coll ...