博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【学习/模板】tarjan割点
阅读量:6428 次
发布时间:2019-06-23

本文共 1900 字,大约阅读时间需要 6 分钟。

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
2 #include
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

你可能感兴趣的文章
示例化讲解RIP路由更新机制
查看>>
eclipse不能自动编译工程的解决方法
查看>>
Powershell管理系列(九)删除Exchange用户邮箱中多余的电子邮件地址
查看>>
Swt/Jface进度条
查看>>
.NET建议使用的大小写命名原则
查看>>
Git:错误:error:src refspec master does not match any
查看>>
SSIS 数据类型和类型转换
查看>>
Oracle数据库“Specified cast is农田valid”
查看>>
数据层新思路,写数据库无关的数据层 ORM在数据库内做更为合适
查看>>
armv8(aarch64)linux内核中flush_dcache_all函数详细分析【转】
查看>>
房地产英语 Real estate词汇
查看>>
python接口自动化测试(八)-unittest-生成测试报告
查看>>
第 26 章 MySQL
查看>>
Spring.net 学习笔记之ASP.NET底层架构
查看>>
C# System.Windows.Forms.WebBrowser中判断浏览器内核和版本
查看>>
Java 动态太极图 DynamicTaiChi (整理)
查看>>
微信公众平台后台编辑器上线图片缩放和封面图裁剪功能
查看>>
git使用教程2-更新github上代码
查看>>
张掖百公里,再次折戟
查看>>
SAP QM Batch to Batch的转移过账事务中的Vendor Batch
查看>>