LCA学习心得

本文介绍了学习LCA(最近公共祖先)算法的心得,特别是倍增法的实现细节。文章指出,虽然倍增法代码清晰,但常数较大可能影响效率。讨论了处理无向图邻接表的方法以及如何利用跳跃性质优化路径查找。
摘要由CSDN通过智能技术生成

嗯...今天只更新倍增版的 明天看写不写st表 树剖 tarjan等其他实现方式

1.写在前面

其实倍增版lca很好理解 代码看着也不恶心 但据说常数大 跑得慢(相比其他的几种方式)

2.细节一----关于邻接表的处理

无向图记得add两次就好了.....以及edge数组大小——边的两倍

    细节二----fa[now][i]=fa[fa[now][i-1]][i-1];

 这个比较重要由于不是二叉树 因此无法直接*2

fa[now][i-1]是now往上跳2^(i-1)的位置

由于2^i=2^(i-1)+2^(i-1) 因此再跳2^(i-1)就行了

(fa[now][i-1]之前必定处理过,fa[fa[now][i-1]][i-1]也是)

   然后应该没啥了..其他细节应该没什么了 看看我的注释就好了

#include<bits/stdc++.h>
using namespace std;
int n,m,s,tot; 
int first[500005],deepth[500005],fa[500005][25];
struct node
{
	int to;
	int next;
}edge[500005*2];
int read()
{
	int k=0;
	char ch=getchar();
	while(!isdigit(ch))	ch=getchar();
	while(isdigit(ch))	
	{
		k=k*10+ch-'0';
		ch=getchar();
	}
	return k;
}
i
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值