嗯...今天只更新倍增版的 明天看写不写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