博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Uva 11354 LCA 倍增祖先
阅读量:5349 次
发布时间:2019-06-15

本文共 1603 字,大约阅读时间需要 5 分钟。

题目链接:

 

题意:找一条从 s 到 t  的路,使得瓶颈路最小。

点的数目是10^4,如果向之前的方案求 maxcost数组,O(n*n)时间是过不了的,这个时候,用到了增倍祖先。

关于倍增祖先:

我要补充的是,倍增祖先的优点,是在于倍增,他写的案例,没有体现出倍增,这里强调一下。有点像二分的思想;

 

利用倍增祖先初始化maxcost[i][j]数组,maxcost[i][j] 在倍增祖先里面表示的,结点 i 的第2j级祖先之间的瓶颈。

用O(nlogn)初始化,然后,查询是O(logn)。

#include 
using namespace std;const int maxn = 50000 + 10;const int INF = 0x3f3f3f3f;const int logmaxn = 20;int n,m;struct Edge{ int u,v,d; bool operator < (const Edge& rhs) const { return d < rhs.d; }};Edge e[maxn];int pa[maxn];int Find_Set(int x){ if(x!=pa[x]) pa[x] = Find_Set(pa[x]); return pa[x];}vector
G[maxn],C[maxn];struct LCA{ int n; int fa[maxn]; int cost[maxn]; int L[maxn]; int anc[maxn][logmaxn]; int maxcost[maxn][logmaxn]; void preprocess() { for(int i=0; i
=0; i--) { if(L[p]-(1<
=L[q]) { ans = max(ans,maxcost[p][i]); p = anc[p][i]; } } if(p==q) return ans; //lca 是 p for(int i=log; i>=0; i--) { if(anc[p][i]!=-1&&anc[p][i]!=anc[q][i]) { ans = max(ans,maxcost[p][i]); p = anc[p][i]; ans = max(ans,maxcost[q][i]); q = anc[q][i]; } } ans = max(ans,cost[p]); ans = max(ans,cost[q]); return ans; //LCA 是 fa[p] = fa[q]; }};LCA solver;void dfs(int u,int fa,int level){ solver.L[u] = level; for(int i=0; i

 

转载于:https://www.cnblogs.com/TreeDream/p/6146513.html

你可能感兴趣的文章
《Java程序设计》第2周学习总结
查看>>
1123 Is It a Complete AVL Tree(30 分)
查看>>
SEO优化---学会建立高转化率的网站关键词库
查看>>
正则表达式提取器(Regular Expression Extractor)-关联test plan中的sampler
查看>>
c# 读写文件时文件正由另一进程使用,因此该进程无法访问该文件
查看>>
好的网站-问卷星
查看>>
git commit -m 与 git commit -am的区别
查看>>
mysql 获得最新的数据并且去除重复
查看>>
OS X EI Capitan 10.11.1快速升级方法介绍
查看>>
BJQA-IIATF1.0框架之《自动生成有效请求Json串》
查看>>
yii自定义行为组件(简介版)
查看>>
字符串包含
查看>>
Code First :使用Entity. Framework编程(1) ----转发 收藏
查看>>
可以展开和收起的的LinearLayout
查看>>
字符编码
查看>>
SQL中文转拼音
查看>>
hashlib 和 hmac
查看>>
[Bob]Collectors Problem
查看>>
python 推导式中多个if else 问题
查看>>
【English】十一、一般疑问句
查看>>