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]);}}
阅读全文
0 0
- 【LCA】倍增法 LCA
- LCA倍增法模板
- 倍增法求LCA
- LCA倍增法
- hdu5266 LCA 倍增法
- LCA倍增法
- lca倍增法
- LCA倍增法
- 倍增法求LCA
- 在线LCA倍增法
- 倍增法求LCA
- 倍增法求LCA
- 倍增法求 LCA
- Lca倍增法
- LCA倍增法
- 倍增法求LCA
- 浅谈倍增法求LCA
- 倍增法求LCA模版
- 牛顿方法(Newton's Method)
- 【我的Java笔记】形式参数&返回值
- Spring在web开发中的应用与Spring整合junit4测试
- zookeeper实现分布式锁
- JAVA实现不规则图形界面
- LCA倍增法
- MySQL5.5数据库主从(Master/Slave)同步配置详解
- 如何通过窗口句柄来获得一个程序窗口的大小
- SpringMVC笔记
- 【web前端自动化工作环境配置】10. RequireJS总结
- 浅谈大屏地图制图那点事儿
- 二维码跳转页面生成,解析
- Spring整合aspectj框架实现的aop
- LCA树链法