#define ll long long
//头文件以及部分变量、数组的定义(省)
vector<int> g[500004];
void dfs(ll u,ll fa)
{
f[u][0]=fa;
dep[u]=dep[fa]+1;
for(auto v:g[u])
{
if(fa^v) dfs(v,u);
}
}
void init()
{
for(ll j=1;j<=20;j++)
{
for(ll i=1;i<=n;i++)
{
f[i][j]=f[f[i][j-1]][j-1];
}
}
}
ll lca(ll u,ll v)
{
if(dep[u]<dep[v])swap(u,v);
for(ll i=20;i>=0;i--)
{
if(dep[f[u][i]]>=dep[v]) u=f[u][i];
}
if(u==v) return u;
for(ll i=20;i>=0;i--)
{
if(f[u][i]!=f[v][i]) u=f[u][i],v=f[v][i];
}
return f[u][0];
}
int main()
{
//输入(省)
dfs(s,0);
init();
for(ll i=1;i<=m;i++)
{
ll a,b;
cin>>a>>b;
cout<<lca(a,b)<<'\n';
}
return 0;
}
上述代码已经AC,为了防止部分用户直接完整借鉴进而带来不良影响,将部分内容进行了省略,请各位谅解。
本人已经理解了这篇代码的大部分内容,但是对于dfs函数的编写以及具体意义尚有不足,有没有dalao帮我解释一下QWQ~