Tarjan求强联通分量以及Tarjan O(m+n)求LCA
来源:互联网 发布:淘宝产品打折功能收费 编辑:程序博客网 时间:2024/05/21 07:11
Preface
一开始以为Tarjan是个很高级的东西,结果学了一发,发现Tarjan异常的好打,也不是很难理解.
强联通分量O(m)
来一发定义:
- 强联通分量的定义是:一个强联通分量里的任意两个点都可以互相到达,且是这个图里的极大强联通子图.
具体的算法步骤如下:
设
dfn[x] 表示访问x 这个节点的编号设
low[x] 表示x 可以到达的节点j1,j2……,jk 中最小的dfn[ji] 设
vis[x] 表示当前点x 是否还在栈中Maintain
- 每次当有
dfn[x]==low[x] 时,从栈顶到x 这一段,便组成一个强联通分量.
- 每次当有
void Tarjan(int k){ dfn[k] = ++dfsnum, low[k] = dfsnum, d[++top] = k; for (int x = last1[k]; x; x = next1[x]) { if (!dfn[tov1[x]]) Tarjan(tov1[x]); if (!vis[tov1[x]]) low[k] = min(low[k],low[tov1[x]]); } if (dfn[k]==low[k]) { ++cnt; while (d[top+1] != k) vis[d[top--]] = true; }}
Tarjan求LCA.
其实这个更简单,也就是记录一个
fa[i] .表示这个节点是否到达过.
并且它的父亲是什么(两重含义)
那么,每次到达一个点
i ,看看与它要求的lca 的所有fa[i] 是否求过,如果求过,那么就一直往上跳,直到不能跳为止,那个点即为LCA.具体的证明就很简单了,随便画一画就知道这是对的,O(n+Q)
阅读全文
0 0
- Tarjan求强联通分量以及Tarjan O(m+n)求LCA
- tarjan求强联通分量
- tarjan求强联通分量
- 图论--Tarjan求强联通分量
- 算法笔记(二):tarjan 算法求强联通分量
- HDU 3836 Equivalent Sets (tarjan求强联通分量)
- hdu1269 迷宫城堡 tarjan求强联通分量
- 求有向图强联通分量--Tarjan算法
- tarjan求强连通分量
- tarjan 求强连通分量
- tarjan求强连通分量
- Tarjan求强连通分量
- tarjan求强连通分量
- Tarjan求强连通分量
- 强联通分量-tarjan
- 上白泽慧音 题解 ---- tarjan求强连通分量
- Tarjan算法求强连通分量
- 求强连通分量的Tarjan算法
- Java基础---数组
- json
- 华为机试之字符个数统计
- 函数
- 流程控制
- Tarjan求强联通分量以及Tarjan O(m+n)求LCA
- Reverse Nodes in k-Group--LeetCode
- 17.9.23B组总结
- form表单在spring 开发环境下的提交
- Sqoop2 Java客户端API指南
- Apache的https实现
- cocos-2d sufaceView 与活动通信导致变黑变白问题
- Java后台框架篇--Springsecurity(一)
- hdu 565 入门题