LCA学习心得

嗯...今天只更新倍增版的 明天看写不写st表 树剖 tarjan等其他实现方式1.写在前面其实倍增版lca很好理解 代码看着也不恶心 但据说常数大 跑得慢(相比其他的几种方式)2.细节一----关于邻接表的处理无向图记得add两次就好了.....以及edge数组大小——边的两倍    细节二----fa[now][i]=fa[fa[now][i-1]][i-1]; 这个比较重要由于不是二叉树 因...
摘要由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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值