倍增LCA 模板
2016-07-08 15:46
162 查看
基本思想是用类似rmq的算法
f[i,j]表示点i向上跳2j步后的点
预处理f
fa[i]为i的父亲
求lca
f[i,j]表示点i向上跳2j步后的点
预处理f
fa[i]为i的父亲
fo(i,1,n) f[i][0]=fa[i]; fo(j,1,16) fo(i,1,n) f[i][j]=f[f[i][j-1]][j-1];
求lca
int lca(int x,int y) { fd(i,16,0) if(deep[f[x][i]]>=deep[y]) x=f[x][i]; fd(i,16,0) if(deep[f[y][i]]>=deep[x]) y=f[y][i]; fd(i,16,0) if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i]; if (x!=y) x=f[x][0],y=f[y][0];return x; }
相关文章推荐
- 使用MySQL WorkBench导出mysql数据库关系图
- PAT 1025 反转链表
- Swift,语法入门学习
- 模拟简单的时钟
- 工厂模式
- Vysor 插件破解版(beta版本)解决更新正式版本后的收费限制
- c++ 流的注意事项
- 盘块分配--位示图法
- 任务调度中心 (优化版)【原】
- VS插件集
- HDU5438:Ponds(拓扑排序)
- windows 下使用 zip安装包安装MySQL 5.7
- JS:window.onload的使用介绍
- C#笔记_1-动态生成类,程序集
- Android利用ObjectAnimator实现ArcMenu
- echarts获取注册地图方法
- 适用于头像的圆形的ImageView
- Street
- 有些人为什么那么努力
- ORACLE创建表之前判断表是否存在与SQL Server 对比使用