LCA求法的三度升级
来源:互联网 发布:lol总是网络断开连接 编辑:程序博客网 时间:2024/04/29 06:09
1.RMQ做法:
可见:学会用rmq解决lca问题
2.倍增做法:
可见:LCA倍增
3.轻重路径剖分法:
轻重路径剖分基础:树链剖分(无需看剖分过程,重点搞清楚什么是轻重路径)
那么,具体过程可以类比剖分的query过程:
<span style="font-size:24px;">void dfs1(int u){ dep[u]=dep[fa[u]]+1; int Max=0; for (int p=a[u];p;p=e[p].next) if (e[p].j!=fa[u]){ int j=e[p].j; dis[j]=dis[u]+e[p].v; fa[j]=u; dfs1(j); size[u]+=size[j];//统计子节点的个数 if (size[u]>Max){//选择子节点的儿子继续传递重路径 Max=size[u]; son[u]=j; } }}</span>
<span style="font-size:24px;">void build(int u,int tp){ top[u]=tp; if (son[u])build(son[u],tp);//选择子节点最多的儿子继续传递重路径 for (int p=a[u];p;p=e[p].next) if (e[p].j!=fa[u] && e[p].j!=son[u])build(e[p].j,e[p].j);//其余儿子自开一条重路径}//构建轻重路径int LCA(int u,int v){ int fu=top[u],fv=top[v];//都爬到各自重路径的顶端 while (fu != fv){ if (dep[fu]<dep[fv])swap(fu,fv),swap(u,v); u=fa[fu];fu=top[u];//不断沿重路径向上爬 } return dep[u]<dep[v]?u:v;//此时在同一重路径中,深度浅的即为LCA}</span>
该做法的效率同为logn,但常数更优,在某些卡点的题目中(如NOIP2015运输计划)就可以体现优势。
但是该做法同样会被卡点(除非完全随机化),所以应根据题目有所选择。
0 0
- LCA求法的三度升级
- LCA的RMQ求法
- LCA的三种求法
- LCA的tarjan求法&&POJ 1470的辛酸历程
- 【XJB研究】关于几种LCA求法的时间
- LCA求法--Tarjan与倍增与RMQ
- 单源最短路径的求法
- 数素的求法
- 逆矩阵的求法!
- 质数的最快求法
- 素数的求法
- 孪生素数的求法
- 圆周率PI的求法
- 大数阶乘的求法
- 最大团的求法
- 特征向量的数值求法
- c++ sinx的求法
- 素数的求法
- ubuntu VMtools安装方法
- 如果你有无穷多的水,一个3公升的提捅,一个5公升的提捅,两只提捅形状上下都不均匀, 问你如何才能准确称出4公升的水?(40秒-3分钟)
- 面向对象的三大特性总结
- 动态改变窗口图标的方法 WM_SETICON消息
- jdk高版本编译低版本jar导致的运行错误.md
- LCA求法的三度升级
- 你有一桶果冻,其中有黄色、绿色、红色三种,闭上眼睛抓取同种颜色的两个。 抓取多少个就可以确定你肯定有两个同一颜色的果冻?(5秒-1分钟)
- nginx开机自启动
- 当最小化的时候,在一段时间内想让窗口不显示的解决方案WM_QUERYOPEN消息
- 时间线程Timer
- System与Runtime源码解析
- 烧一根不均匀的绳,从头烧到尾总共需要1个小时。 现在有若干条材质相同的绳子,问如何用烧绳的方法来计时一个小时十五分钟呢?
- HDOJ 5135 Little Zu Chongzhi's Triangles(贪心)
- JAVA使用POI如何导出百万级别数据