最近公共祖先(LCA)
https://www.luogu.com.cn/problem/P3379
点击查看代码
#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std;
const int N=1e6+5;
const int LogN=20;
int n,q;
long long dep[N],father[N][LogN+1];
int cnt=0,head[N],to[N*2],nxt[N*2];
void add(int u,int v)
{to[++cnt]=v;nxt[cnt]=head[u];head[u]=cnt;
}
void dfs(int u,int fa)
{father[u][0]=fa;dep[u]=dep[fa]+1;for(int i=1;i<=LogN;i++)father[u][i]=father[father[u][i-1]][i-1];for(int i=head[u];i;i=nxt[i]){int v=to[i];if(v==fa) continue;dfs(v,u);}
}
long long LCA(int x,int y)
{if(dep[x]<dep[y]) swap(x,y);for(int i=LogN;i>=0;i--)if(dep[father[x][i]]>=dep[y])x=father[x][i];if(x==y) return x;for(int i=LogN;i>=0;i--){if(father[x][i]!=father[y][i]){x=father[x][i];y=father[y][i];}}return father[x][0];
}
int main()
{IOS;int s;cin>>n>>q>>s;for(int i=1;i<n;i++){int u,v;cin>>u>>v;add(u,v);add(v,u);}dfs(s,0);while(q--){int x,y;cin>>x>>y;cout<<LCA(x,y)<<'\n';}return 0;
}
https://www.luogu.com.cn/problem/P3884
点击查看代码
#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std;
const int N=1e5+5;
const int LogN=20;
int n,q;
long long dep[N],father[N][LogN+1],sum[LogN],max_dep;
int cnt=0,head[N],to[N*2],nxt[N*2];
void add(int u,int v)
{to[++cnt]=v;nxt[cnt]=head[u];head[u]=cnt;
}
void dfs(int u,int fa)
{father[u][0]=fa;dep[u]=dep[fa]+1;for(int i=1;i<=LogN;i++)father[u][i]=father[father[u][i-1]][i-1];for(int i=head[u];i;i=nxt[i]){int v=to[i];if(v==fa) continue;dfs(v,u);}
}
long long LCA(int x,int y)
{if(dep[x]<dep[y]) swap(x,y);for(int i=LogN;i>=0;i--)if(dep[father[x][i]]>=dep[y])x=father[x][i];if(x==y) return x;for(int i=LogN;i>=0;i--){if(father[x][i]!=father[y][i]){x=father[x][i];y=father[y][i];}}return father[x][0];
}
int main()
{IOS;cin>>n;for(int i=1;i<n;i++){int u,v;cin>>u>>v;add(u,v);}dfs(1,1);for(int i=1;i<=n;i++)max_dep=max(max_dep,dep[i]),sum[dep[i]]++,sum[0]=max(sum[0],sum[dep[i]]);cout<<max_dep<<'\n'<<sum[0]<<'\n';int x,y;cin>>x>>y;cout<<(dep[x]-dep[(LCA(x,y))])*2+dep[y]-dep[(LCA(x,y))]<<'\n';return 0;
}