暴力思想:
先把两个起点移动到同一个深度上,
再同时进行while循环,寻找公共祖先,找到就可以break
其实这跟正版的倍增lca就差一个数组,和一个二进制优化2^n
上代码:
#include<bits/stdc++.h>
using namespace std;
const int Maxn=5e6+5;
struct egde{
int to,next;
}e[Maxn];
int n,m,s,tot;
int dep[Maxn],fa[Maxn],head[Maxn];
inline void add(int u,int v)
{
e[++tot].to=v;
e[tot].next=head[u];
head[u]=tot;
}
inline void dfs(int x,int f)
{
fa[x]=f;
dep[x]=dep[f]+1;
for(int i=head[x];i;i=e[i].next)
{
if(e[i].to!=f)
{
dfs(e[i].to,x);
}
}
}
int tmp;
#define swap(a,b) tmp=a,a=b,b=tmp
inline int lca(int u,int v)
{
if(dep[u]<dep[v]) swap(u,v);
while(dep[u]>dep[v])
{
u=fa[u];
}
while(u!=v)
{
u=fa[u];
v=fa[v];
}
return u;
}
int main()
{
scanf("%d%d%d",&n,&m,&