LCA倍增法

来源:互联网 发布:日本dna数据库 编辑:程序博客网 时间:2024/06/16 16:19
#include<cstdio>#include<algorithm>#include<vector>#include<cctype>using namespace std;int n,m,fa[100005],dep[100005],f[100005][20];vector<int>g[100005];void get(int &res){char ch;while(!isdigit(ch=getchar()));for(res=ch-'0';isdigit(ch=getchar());res=res*10+ch-'0');}void dfs(int i){f[i][0]=fa[i];dep[i]=dep[fa[i]]+1;for(int j=0;j<g[i].size();j++)dfs(g[i][j]);}int getk(int now,int k){for(int i=0;i<=19;i++)if(k&(1<<i)) now=f[now][i];return now;}int getd(int now,int k){return getk(now,dep[now]-k);}int main(){int u,v,tmp,root;get(n);for(int i=1;i<=n;i++){get(u),get(tmp);for(int i=1;i<=tmp;i++){get(v);g[u].push_back(v);fa[v]=u;}}for(int i=1;i<=n;i++)if(!fa[i]){root=i;break;}dfs(root);scanf("%d",&m);for(int j=1;j<=19;j++)for(int i=1;i<=n;i++)f[i][j]=f[f[i][j-1]][j-1];for(int i=1;i<=m;i++){scanf("%d%d",&u,&v);if(dep[u]<dep[v]) u^=v,v^=u,u^=v;u=getd(u,dep[v]);if(u==v){ printf("%d\n",u);continue;}for(int j=19;j>=0;j--)if(f[u][j]!=f[v][j])u=f[u][j],v=f[v][j];printf("%d\n",fa[u]);}}

原创粉丝点击