tarjan 割点 割边
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 割点 割边的更多相关文章
- Tarjan 割点割边【模板】
#include <algorithm> #include <cstring> #include <cstdio> using namespace std; +); ...
- 【学习整理】Tarjan:强连通分量+割点+割边
Tarjan求强连通分量 在一个有向图中,如果某两点间都有互相到达的路径,那么称中两个点强联通,如果任意两点都强联通,那么称这个图为强联通图:一个有向图的极大强联通子图称为强联通分量. 算法可以在 ...
- 求割点 割边 Tarjan
附上一般讲得不错的博客 https://blog.csdn.net/lw277232240/article/details/73251092 https://www.cnblogs.com/colle ...
- tarjan求割边割点
tarjan求割边割点 内容及代码来自http://m.blog.csdn.net/article/details?id=51984469 割边:在连通图中,删除了连通图的某条边后,图不再连通.这样的 ...
- Tarjan算法 (强联通分量 割点 割边)
变量解释: low 指当前节点在同一强连通分量(或环)能回溯到的dfn最小的节点 dfn 指当前节点是第几个被搜到的节点(时间戳) sta 栈 vis 是否在栈中 ans 指强连通分量的数量 top ...
- Tarjan算法与割点割边
目录 Tarjan算法与无向图的连通性 1:基础概念 2:Tarjan判断割点 3:Tarjan判断割边 Tarjan算法与无向图的连通性 1:基础概念 在说Tarjan算法求解无向图的连通性之前,先 ...
- 图的连通性——Tarjan算法&割边&割点
tarjan算法 原理: 我们考虑 DFS 搜索树与强连通分量之间的关系. 如果结点 是某个强连通分量在搜索树中遇到的第⼀个结点,那么这个强连通分量的其余结点肯定 是在搜索树中以 为根的⼦树中. 被称 ...
- {part2}DFN+LOW(tarjan)割边
首先非树边肯定不是割边,因为去掉它DFS树不受影响,只要还能生成一棵DFS树那么图就是连通的. 然后割掉一条树边只可能造成一个点与它的父亲不连通. 那好办,也就是说这个以这个点为根的子树就是上面所说的 ...
- 【NOIP训练】【Tarjan求割边】上学
题目描述 给你一张图,询问当删去某一条边时,起点到终点最短路是否改变. 输入格式 第一行输入两个正整数,分别表示点数和边数.第二行输入两个正整数,起点标号为,终点标号为.接下来行,每行三个整数,表示有 ...
随机推荐
- Ubuntu Server 上安装pip后pip命令报错的解决办法
Installation Do I need to install pip? pip is already installed if you are using Python 2 >=2.7.9 ...
- [C#基础知识系列]专题十:全面解析可空类型[转]
原文链接 主要内容: 1:空合并操作符(?? 操作符) ??操作符也就是"空合并操作符",它代表的意思是两个操作数,如果左边的数不为null时,就返回左边的数,如果左边的数为nul ...
- 1475 建设国家 DP
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1475 这题转化过来就是,给定n个点,每个点都有一个过期时间,一个价值.现 ...
- 利用正则将xml数据解析为数组
function xml_to_array( $xml ) { $reg = '/<(\w+)[^>]*>([\x00-\xFF]*)<\/\1>/'; if(preg_ ...
- Codeforces Round #230 (Div. 1)
A: 题意:给你一个半径为n的圆 求最少阻塞多少个点 才能使所以圆内及圆上的点 都不与外边的点相连 相连是距离为1 只算整数点 这题定住x,y依次递减 判断一下是否4-connect 这个意思就是 ...
- [转]Walkthrough: Your First F# Program
本文转自:http://msdn.microsoft.com/en-us/library/vstudio/dd233160(v=vs.100).aspx Visual Studio 2010 in ...
- Hibernate配置(通过注解配置)
本文主要讲通过注解配置来替换Hibernate的映射文件 1.多对一配置 package com.jazz7.entity; import java.util.Date; import javax.p ...
- AJPFX关于Collection 集合的表述
集合的遍历class Demo_Collection{ public static void main(String[] args){ Collection c = new ...
- [BZOJ1257][CQOI2007]余数之和sum 数学+分块
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1257 题目所求为$$Ans=\sum_{i=1}^nk%i$$ 将其简单变形一下$$Ans ...
- Windows下使用JMeter
简介 Apache JMeter是100%纯java桌面应用程序,被设计用来测试C/S结构的软件(例如web应用程序).它可以被用来测试包括基于静态和动态资源程序的性能,例如静态文件,Java Ser ...