参考资料: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相关推荐

  1. tarjan算法不是很懂先mark一下。

     前面为转载的.后面是自己的理解. 三种tarjan算法(上) .这篇算是做一个总结吧. 求强连通分量 求无向图的割和桥 最近公共祖先 求强连通分量 基本概念:       强连通是有向图才有的概念. ...

  2. Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)...

    转载自:http://hi.baidu.com/lydrainbowcat/blog/item/2194090a96bbed2db1351de8.html 基本概念: 1.割点:若删掉某点后,原连通图 ...

  3. 0x66.图论 - Tarjan算法与无向图连通性

    目录 一.无向图的割点与桥 割点 桥/割边 时间戳 搜索树 追溯值 二.割边判定法则 三.割点判定法则 1.luogu P3388 [模板]割点(割顶) 2.luogu P3469 [POI2008] ...

  4. 『Tarjan算法 无向图的双联通分量』

    无向图的双连通分量 定义:若一张无向连通图不存在割点,则称它为"点双连通图".若一张无向连通图不存在割边,则称它为"边双连通图". 无向图图的极大点双连通子图被 ...

  5. Tarjan算法学习笔记

    一种由Robert Tarjan提出的求解有向图强连通分量的线性时间的算法. [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected ...

  6. 『追捕盗贼 Tarjan算法』

    追捕盗贼(COCI2007) Description 为了帮助警察抓住在逃的罪犯,你发明了一个新的计算机系统.警察控制的区域有N个城市,城市之间有E条双向边连接,城市编号为1到N. 警察经常想在罪犯从 ...

  7. 算法提高课-图论-有向图的强连通分量-AcWing 367. 学校网络:强连通分量、tarjan算法

    文章目录 题目解答 题目来源 题目解答 来源:acwing 分析: 第一问:通过tarjan算法求出强连通分量并且缩点后,统计入度为0的点的个数p即可. 第二问,至少加几条边才能使图变成强连通分量?这 ...

  8. CSP认证201509-4 高速公路[C++题解]:强连通分量、tarjan算法模板题

    题目分析 来源:acwing 分析: 所求即为强连通分量的个数,然后计算每个强连通分量中点的个数,相加即可. 所谓强连通分量,它是一个子图,其中任意两点可以相互到达,并且再加一个点,就不能满足任意两点 ...

  9. 算法提高课-图论-有向图的强连通分量-AcWing 1174. 受欢迎的牛:tarjan算法求强连通分量、tarjan算法板子、强连通图

    文章目录 题目解答 题目来源 题目解答 来源:acwing 分析: 强连通图:给定一张有向图.若对于图中任意两个结点x,y,既存在从x到y的路径,也存在从y到x的路径,则称该有向图是"强连通 ...

最新文章

  1. RNN,LSTM,GRU基本原理的个人理解重点
  2. Master3 罗技 版本号的问题
  3. 错误: 程序包r2不存在_坚果R2相机评测:大底终成大器,跻身第一梯队
  4. Centos 安装 MySql
  5. PHP中htmlentities和htmlspecialchars的区别
  6. [TypeScript] Overload a Function with TypeScript’s Overload Signatures
  7. 查找、移除某个视图上的某类控件
  8. 「Luogu1552」[APIO2012]派遣
  9. mysql主从复制深入研究_mysql主从复制原理,深入探讨
  10. 谁偷偷删了你的微信?别慌!一篇Python学习教程帮你都揪出来
  11. linux tar命令 打包压缩
  12. PGSQL Key (id)=(1) already exists.
  13. SkeyeLive同屏直播库库功能介绍和接口说明与调用
  14. 计算机硬件主流参数,小白秒成DIY大神 自学电脑硬件参数速成攻略
  15. 微型计算机显示器的标准接口,HJ/T 313-2006 环境标志产品技术要求 微型计算机、显示器...
  16. 我的未来作文计算机行业,我的未来职业畅想作文
  17. 微信web中IOS系统手机摇一摇功能实现及问题解决
  18. 二叉树、满二叉树、完全二叉树、平衡二叉树、二叉排序树、线索二叉树
  19. linux 运行 epics,CentOS7安装EPICS Base与建立IOC实例
  20. 联想g400从u盘启动计算机,联想g400笔记本设置U盘启动的图文步骤

热门文章

  1. UML类图关系(泛化 、继承、实现、依赖、关联、聚合、组合)
  2. Mahout分步式程序开发 基于物品的协同过滤ItemCF
  3. 梯度方向直方图和物体检测Histogram of Oriented Gradients and Object Detection
  4. 关于Python编程的一些问答
  5. Machine Learning week 2 quiz: Octave Tutorial
  6. 希腊字母(mark)
  7. SSM 框架 Maven项目整合实例
  8. OpenShift Rancher 进行持续集成
  9. Zabbix如何实现Server和Agent的通信加密
  10. linux系统被***后处理经历