LCA之tarjan

本文介绍了如何利用Tarjan算法解决最小公共祖先问题。这是一个离线算法,可以通过深度优先搜索(DFS)和并查集来实现。在DFS遍历过程中,当回溯到节点时,将其祖先设置为其父亲节点,并检查待求解的两个点中,另一个点是否已被访问。如果已访问,那么当前节点就是另一节点的祖先。
摘要由CSDN通过智能技术生成

LCA即最小公共祖先,tarjan为LCA的离线算法, 可通过dfs和并查集实现。

算法核心思想是用dfs遍历整个树,在遍历到底层返回过程中将当前节点的祖先设为其父亲节点,并遍历需要求解的两点中以当前节点为起点的另外一点是否已访问过,若已访问过,则该答案就是另外一节点当前的祖先。具体看代码注释。
核心代码:

void tarjan(int u)
{
   
	vis[u] = true;//标记 
	for(int i = head[u]; i != -1; i = edge[i].nex)//遍历当前节点的儿子
	{
   
		int v = edge[i].v;
		if(vis[v])	continue;//若访问过, 跳过,主要是为了防止查找其父亲节点,若是单向边可以省去 
		tarjan(v);
		Union(v, u);//将v并到u的祖先里 
	}
	vector<Node>::iterator it = q[u].begin();
	for(; it != q[u].end(); it++)//需要查找的边里有没有以u为起点 
	{
   
		if(vis[(*it).v])
		{
   
			ans[(*it).id] = find((*it).v);<
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值