Tarjan算法_LCA
参考资料:Tarjan算法_LCA tarjan算法求LCA Tarjan 算法&模板
只是对其中的代码进行一下注释,如有错误还得回来再改。
//不怕别人比你聪明,就怕别人比你聪明还比你努力 #include<iostream> #include<string> #include<algorithm> #include<cstdio> #include<cstring> #include<cmath> #include <set> #include <stack> #include <map> #include<vector> #define INF 0x3f3f3f3fusing namespace std; const int MAXN = 10005; vector<int> vec[MAXN]; bool vis[MAXN]; int per[MAXN],head[MAXN],in_num[MAXN]; //in_num统计每个点的入度,为了求根节点,per和并查集中的作用相同,head配合结构体前向星 int cnt,n,m; //感觉Node struct Node {int c,next; }edge[MAXN];void Init() {cnt = 0;memset(in_num,0,sizeof(in_num));memset(head,-1,sizeof(head));memset(vis,0,sizeof(vis));for(int i =1;i <= n;i++){vec[i].clear();per[i] = i;} }void add(int x,int y) {edge[++cnt].next = head[x];edge[cnt].c = y;head[x] = cnt; }int Find(int x) {if(per[x] != x)per[x] = Find(per[x]);return per[x]; }void Union(int x,int y) {x = Find(x);y = Find(y);if(x == y)return ;per[x] = y; }void Tarjan(int x) {for(int i = head[x];i != -1; i =edge[i].next){int v = edge[i].c;Tarjan(v);Union(v,x);//首先要一直遍历的叶子节点 }vis[x] = 1; // 当这个节点的所有子节点都已经遍历到了,就标记这个节点for(int i = 0;i < vec[x].size();i ++)if(vis[vec[x][i]])//然后在问题中寻找是否有关于这两个节点都已经标记过的了printf("%d 和 %d 的LAC是 %d\n",x,vec[x][i],Find(vec[x][i])); } int main() {int x,y;scanf("%d%d",&n,&m);Init();for(int i = 1;i < n;i++){scanf("%d%d",&x,&y);add(x,y);in_num[y] ++;}for(int i = 0;i < m;i ++){scanf("%d%d",&x,&y);vec[x].push_back(y);vec[y].push_back(x);}int root;for(int i = 1;i <= n;i ++)if(in_num[i] == 0)root = i;Tarjan(root); } /** 8 4 1 2 1 3 2 4 2 5 4 7 5 8 3 6 7 8 5 6 5 2 4 6 **/
转载于:https://www.cnblogs.com/bright-mark/p/9588633.html
Tarjan算法_LCA相关推荐
- tarjan算法不是很懂先mark一下。
前面为转载的.后面是自己的理解. 三种tarjan算法(上) .这篇算是做一个总结吧. 求强连通分量 求无向图的割和桥 最近公共祖先 求强连通分量 基本概念: 强连通是有向图才有的概念. ...
- Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)...
转载自:http://hi.baidu.com/lydrainbowcat/blog/item/2194090a96bbed2db1351de8.html 基本概念: 1.割点:若删掉某点后,原连通图 ...
- 0x66.图论 - Tarjan算法与无向图连通性
目录 一.无向图的割点与桥 割点 桥/割边 时间戳 搜索树 追溯值 二.割边判定法则 三.割点判定法则 1.luogu P3388 [模板]割点(割顶) 2.luogu P3469 [POI2008] ...
- 『Tarjan算法 无向图的双联通分量』
无向图的双连通分量 定义:若一张无向连通图不存在割点,则称它为"点双连通图".若一张无向连通图不存在割边,则称它为"边双连通图". 无向图图的极大点双连通子图被 ...
- Tarjan算法学习笔记
一种由Robert Tarjan提出的求解有向图强连通分量的线性时间的算法. [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected ...
- 『追捕盗贼 Tarjan算法』
追捕盗贼(COCI2007) Description 为了帮助警察抓住在逃的罪犯,你发明了一个新的计算机系统.警察控制的区域有N个城市,城市之间有E条双向边连接,城市编号为1到N. 警察经常想在罪犯从 ...
- 算法提高课-图论-有向图的强连通分量-AcWing 367. 学校网络:强连通分量、tarjan算法
文章目录 题目解答 题目来源 题目解答 来源:acwing 分析: 第一问:通过tarjan算法求出强连通分量并且缩点后,统计入度为0的点的个数p即可. 第二问,至少加几条边才能使图变成强连通分量?这 ...
- CSP认证201509-4 高速公路[C++题解]:强连通分量、tarjan算法模板题
题目分析 来源:acwing 分析: 所求即为强连通分量的个数,然后计算每个强连通分量中点的个数,相加即可. 所谓强连通分量,它是一个子图,其中任意两点可以相互到达,并且再加一个点,就不能满足任意两点 ...
- 算法提高课-图论-有向图的强连通分量-AcWing 1174. 受欢迎的牛:tarjan算法求强连通分量、tarjan算法板子、强连通图
文章目录 题目解答 题目来源 题目解答 来源:acwing 分析: 强连通图:给定一张有向图.若对于图中任意两个结点x,y,既存在从x到y的路径,也存在从y到x的路径,则称该有向图是"强连通 ...
最新文章
- RNN,LSTM,GRU基本原理的个人理解重点
- Master3 罗技 版本号的问题
- 错误: 程序包r2不存在_坚果R2相机评测:大底终成大器,跻身第一梯队
- Centos 安装 MySql
- PHP中htmlentities和htmlspecialchars的区别
- [TypeScript] Overload a Function with TypeScript’s Overload Signatures
- 查找、移除某个视图上的某类控件
- 「Luogu1552」[APIO2012]派遣
- mysql主从复制深入研究_mysql主从复制原理,深入探讨
- 谁偷偷删了你的微信?别慌!一篇Python学习教程帮你都揪出来
- linux tar命令 打包压缩
- PGSQL Key (id)=(1) already exists.
- SkeyeLive同屏直播库库功能介绍和接口说明与调用
- 计算机硬件主流参数,小白秒成DIY大神 自学电脑硬件参数速成攻略
- 微型计算机显示器的标准接口,HJ/T 313-2006 环境标志产品技术要求 微型计算机、显示器...
- 我的未来作文计算机行业,我的未来职业畅想作文
- 微信web中IOS系统手机摇一摇功能实现及问题解决
- 二叉树、满二叉树、完全二叉树、平衡二叉树、二叉排序树、线索二叉树
- linux 运行 epics,CentOS7安装EPICS Base与建立IOC实例
- 联想g400从u盘启动计算机,联想g400笔记本设置U盘启动的图文步骤
热门文章
- UML类图关系(泛化 、继承、实现、依赖、关联、聚合、组合)
- Mahout分步式程序开发 基于物品的协同过滤ItemCF
- 梯度方向直方图和物体检测Histogram of Oriented Gradients and Object Detection
- 关于Python编程的一些问答
- Machine Learning week 2 quiz: Octave Tutorial
- 希腊字母(mark)
- SSM 框架 Maven项目整合实例
- OpenShift Rancher 进行持续集成
- Zabbix如何实现Server和Agent的通信加密
- linux系统被***后处理经历