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求割边】上学
题目描述 给你一张图,询问当删去某一条边时,起点到终点最短路是否改变. 输入格式 第一行输入两个正整数,分别表示点数和边数.第二行输入两个正整数,起点标号为,终点标号为.接下来行,每行三个整数,表示有 ...
随机推荐
- 背包DP HDOJ 5410 CRB and His Birthday
题目传送门 题意:有n个商店,有m金钱,一个商店买x件商品需要x*w[i]的金钱,得到a[i] * x + b[i]件商品(x > 0),问最多能买到多少件商品 01背包+完全背包:首先x == ...
- 创建一个长度是5的数组,并填充随机数。使用for循环或者while循环,对这个数组实现反转效果
package day01; import java.util.Random; /** * 首先创建一个长度是5的数组,并填充随机数.使用for循环或者while循环,对这个数组实现反转效果 * @a ...
- D. Artsem and Saunders 数学题
http://codeforces.com/contest/765/problem/D 这题的化简,不能乱带入,因为复合函数的带入,往往要严格根据他们的定义域的 题目要求出下面两个函数 g[h(x)] ...
- HTML5的音频播放和视频播放
1.音频播放 audio(音频) html5提供了播放音频文件的标准 <audio src="anli.mp3" controls="controls" ...
- 微信小程序button授权页面,用户拒绝后仍可再次授权
微信小程序授权页面,进入小程序如果没授权跳转到授权页面,授权后跳转到首页,如果用户点拒绝下次进入小程序还是能跳转到授权页面,授权页面如下 app.js 中的 onLaunch或onShow中加如下代 ...
- SCANF输入错误
while((a<=0||a>=10)||(b<=0||b>=10)) { fflush(stdin); cout<<" ...
- ESSENTIALS OF PROGRAMMING LANGUAGES (THIRD EDITION) :编程语言的本质 —— (一)
# Foreword> # 序 This book brings you face-to-face with the most fundamental idea in computer prog ...
- [Tunny]Grunt基础介绍
[黄映焜/Tunny,20140711] Grunt是一个JavaScript任务管理器,对于需要反复重复的任务,例如压缩.编译.单元测试.代码检查等,自动化工具可以减轻你的劳动,简化你的工作. 本文 ...
- (一)Redis for Windows正确打开方式
目录 (一)Redis for Windows正确打开方式 (二)Redis for 阿里云公网连接 (三)Redis for StackExchange.Redis 下载地址 官网.中文网1 及 中 ...
- 这是一条立了Flag的不归路
时间2017年7月11日 14:48:40 首次激活博客园的博客来进行学习记录,立下了不算远大的小目标,下一步就是要一步一步的往前走. Java是目前最普遍的使用语言之一,作为一名测试,本应该去学习更 ...