【学习/模板】tarjan割点
P3388 【模板】割点(割顶)
tarjan爷爷造福世界
- 割点适用于无向图, 所以low数组定义发生变化,不再是最早能追溯到的栈中节点编号(因为是无向边,没有意义), 而是一直往下走能绕到的最早的割点编号
- 在tarjan求强连通分量是low[u] = min(low[u], dfn[v]) 与 low[u] = min(low[u], low[v]) 等价 但在求割点时只能用前面的qwq
- 原因:在求强连通分量时,如果v已经在栈中,那么说明u,v一定在同一个强连通分量中,所以到最后low[u]=low[v]是必然的,提前更新也不会有问题;
代码qwq
1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 const int maxn = 20020, maxm = 100010; 5 int n, m, num = 0, tim = 0, tot = 0; 6 int head[maxm], dfn[maxn], low[maxn]; 7 bool cut[maxn]; 8 struct edge { 9 int nxt, to; 10 }e[maxm<<1]; 11 int read() { 12 char ch = getchar(); int x = 0, f = 1; 13 while(ch<'0'||ch>'9') {if(ch == '-') f = -1; ch = getchar();} 14 while(ch>='0'&&ch<='9') {x = x * 10 + ch - '0'; ch = getchar();} 15 return x * f; 16 } 17 void add(int from, int to) { 18 e[++num].nxt = head[from]; 19 e[num].to = to; 20 head[from] = num; 21 } 22 void tarjan(int u, int fa) { 23 dfn[u] = low[u] = ++tim; 24 int child = 0; 25 for(int i = head[u]; i; i = e[i].nxt) { 26 int v = e[i].to; 27 if(!dfn[v]) { 28 tarjan(v, fa); 29 low[u] = min(low[u], low[v]); 30 if(low[v] >= dfn[u] && u != fa) cut[u] = 1; 31 //不为根节点, 则对于边(u, v) ,如果low[v]>=dfn[u],此时u就是割点 32 if(u == fa) child++; 33 } 34 low[u] = min(low[u], dfn[v]);/**/ 35 } 36 if(child >= 2 && u == fa) cut[u] = 1; 37 //如果是根节点 , 有两棵及以上的子树, 即为割点 38 } 39 int main() { 40 scanf("%d%d", &n, &m); 41 for(int i = 1; i <= m; i++) { 42 int x = read(), y = read(); 43 add(x, y), add(y, x); 44 } 45 for(int i = 1; i <= n; i++) 46 if(!dfn[i]) tarjan(i, i); 47 for(int i = 1; i <= n; i++) 48 if(cut[i]) tot++; 49 printf("%d\n", tot); 50 for(int i = 1; i <= n; i++) 51 if(cut[i]) printf("%d ", i); 52 return 0; 53 }
我觉得比缩点好懂QAQ
转载于:https://www.cnblogs.com/Hwjia/p/9856125.html
【学习/模板】tarjan割点相关推荐
- 洛谷 P3388 【模板】割点(割顶) 根+非根+dfn[]+low[]+不一样的Tarjan算法
洛谷 P3388 [模板]割点(割顶) 根+非根+dfn[]+low[]+不一样的Tarjan算法 Tarjan算法,详见https://blog.csdn.net/mrcrack/article ...
- BZOJ1123BLO Tarjan割点+乘法原理+dfs
BZOJ1123 BLO : Tarjan割点+乘法原理+dfs Description 给定一张无向图,求每个点被封锁之后有多少个有序点对(x,y)(x!=y,1<=x,y<=n)满足x ...
- 洛谷P3388 【模板】割点(割顶)
/*表示割点模板很难理解.... 但是呢,可以将整个图用深搜来一步步递归.. dfn[x]<=low[tmp] && x!=mr的点就++: 完毕.... PS:小心第一个节点. ...
- 【UOJ#67】新年的毒瘤 Tarjan 割点
#67. 新年的毒瘤 UOJ直接黏贴会炸... 还是戳这里吧: http://uoj.ac/problem/67#tab-statement Solution 看到这题的标签就进来看了一眼. 想 ...
- 割点和桥的模板(割点和割边)
(1)割点与桥(割边)的定义(只存在于无向图) 割点:无向连通图中,去掉一个顶点及和它相邻的所有边,图中的连通分量数增加,则该顶点称为割点. 桥(割边):无向联通图中,去掉一条边,图中的连通分量数增加 ...
- P3388 【模板】割点(割顶) 题解
博客园同步 原题链接 简要题意: 给定一个图,求所有割点. 割点(割顶)的定义:去掉该点整个图不连通. 前置知识: 强连通分量的 Tarjan \texttt{Tarjan} Tarjan 求法. 不 ...
- 【模板】割点(割顶)
题目背景 割点 题目描述 给出一个n个点,m条边的无向图,求图的割点. 输入输出格式 输入格式: 第一行输入n,m 下面m行每行输入x,y表示x到y有一条边 输出格式: 第一行输出割点个数 第二行按照 ...
- HDU 3062 Party(2-sat题模板+tarjan )
题目: 有n对夫妻被邀请参加一个聚会,因为场地的问题,每对夫妻中只有1人可以列席.在2n 个人中,某些人之间有着很大的矛盾(当然夫妻之间是没有矛盾的),有矛盾的2个人是不会同时出现在聚会上的.有没有可 ...
- 模板:割点、桥与双连通
文章目录 割点 代码 桥 点双连通分量 代码 边双连通分量 代码 割点 和强连通分量十分相似 分为树枝边.前向边和后向边 注意! if(x!=r&&low[to]>=dfn[x] ...
最新文章
- System.setProperty()
- 三十八、练习、Python判断一个信用卡号是否合理
- java泛型程序设计——调用遗留代码
- yum install nginx
- LeetCode 1854. 人口最多的年份(差分)
- 【JavaScript】用Switch实现成绩等级判断
- 7-7 天梯赛的善良 (20 分)
- 图神经网络将成AI下一拐点!MIT斯坦福一文综述GNN到底有多强
- 【洛谷】【treap/堆】P2073 送花
- python数据处理太慢_使用Python将数据写入LMDB非常慢
- android tv 蓝牙服务_5款面向Android TV的优秀文件管理器
- 中国大学慕课计算机操作系统答案,计算机操作系统
- 机器人控制器编程课程-教案02-基础
- OPTEE CA和TA通信 实现从java到ca
- Unity TimeLine学习笔记
- 前端处理订单支付超时
- pyspark LEAK: ByteBuf.release() was not called before it's garbage-collected. Enable advanced leak
- [附源码]计算机毕业设计JAVAjsp教学辅助系统
- 古典概型——概率论与数理统计(宋浩)
- 文献阅读(60)ACL2021-Attention Calibration for Transformer in Neural Machine Translation
热门文章
- 004_常用浏览器内核
- Linux查看谁修改的文件,linux如何查看近来修改的文件
- 2017年伊始,你需要尝试的25个Android第三方库
- JavaWeb:过滤器Filter
- 华为数据之道_华为规划的数字世界是什么样子的?
- @mapperscan mapper还是无法引用_高能来了!Java的四大引用
- 域控制器安装完成没有_tcp_udp_Windows 安装 Jupyter Lab
- ole db 访问接口 sqlncli 无法启动分布式事务_阿里终面:分布式事务原理
- mac系统做云服务器,mac系统的云服务器
- Ubuntu 16.04源码编译安装Apache 2.4.25教程