lca的ST算法(在线)
来源:互联网 发布:淘宝联盟高佣与低佣金 编辑:程序博客网 时间:2024/05/29 03:21
学习了lca的ST算法。时间复杂度为O(mlogn)
参考博客:
http://blog.csdn.net/y990041769/article/details/40887469
http://blog.csdn.net/liangzhaoyang1/article/details/52549822
树上最短路公式:
记dis[u]为根节点到u节点的距离。
dist(u,v) = dis[u] + dis[v] - 2 * dis[lca(v, v)]
例题:hdu2586 How far away ?
代码:
#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn = 40010;const int maxe = 20;int n,m;vector<int>G[maxn];vector<int>W[maxn];int tot;int nod[maxn<<1];int dep[maxn<<1];int fir[maxn];ll dfn[maxn];int dp[maxn<<2][maxe];int pp[maxn<<2][maxe];void dfs(int u,int f,int d){ nod[++tot]=u; dep[tot]=d; fir[u]=tot; for(int i=0;i<(int)G[u].size();i++) { int v = G[u][i]; if(v==f) continue; dfn[v]=dfn[u]+W[u][i]; dfs(v,u,d+1); nod[++tot]=u; dep[tot]=d; }}void ST(){ for(int i=1;i<=tot;i++) { dp[i][0]=dep[i]; pp[i][0]=i; } for(int j=1;j<maxe;j++) for(int i=1;i+(1<<j)-1<=tot;i++) { if(dp[i][j-1]<dp[i+(1<<(j-1))][j-1]) { dp[i][j]=dp[i][j-1]; pp[i][j]=pp[i][j-1]; } else { dp[i][j]=dp[i+(1<<(j-1))][j-1]; pp[i][j]=pp[i+(1<<(j-1))][j-1]; } }}int lca(int u,int v){ int l = fir[u]; int r = fir[v]; if(l>r) swap(l,r); int k = 0; while(1<<(k+1)<=r-l+1) k++; if(dp[l][k]<dp[r-(1<<k)+1][k]) return nod[pp[l][k]]; else return nod[pp[r-(1<<k)+1][k]];}void solve(){ scanf("%d %d",&n,&m); for(int i=1;i<=n;i++) { G[i].clear(); W[i].clear(); } for(int i=1;i<n;i++) { int u,v,w; scanf("%d %d %d",&u,&v,&w); G[u].push_back(v); W[u].push_back(w); G[v].push_back(u); W[v].push_back(w); } dfs(1,0,1); ST(); for(int i=1;i<=m;i++) { int u,v; scanf("%d %d",&u,&v); printf("%lld\n",dfn[u]+dfn[v]-2*dfn[lca(u,v)]); }}int main(){ int T; scanf("%d",&T); while(T--) solve(); return 0;}
0 0
- lca的ST算法(在线)
- LCA在线算法(RMQ st算法的结合)
- 浅谈LCA的在线算法ST表
- hdu2586 LCA入门(在线算法ST)
- LCA在线算法ST算法
- LCA在线算法ST算法
- LCA算法-ST在线算法
- LCA(dfs+st)在线算法
- LCA的在线算法, DFS编号 + ST来rmq。
- 求LCA最近公共祖先的在线ST算法_C++
- LCA最近公共祖先的离线算法(Tarjan)和在线算法(ST)
- POJ 1330 (LCA的在线算法,转RMQ用ST算法)
- LCA(st算法)
- ST(RMQ)算法(在线)求LCA
- LCA(最近公共祖先算法)之在线st表法
- 最近公共祖先(LCA)问题-在线ST算法
- hdu 2586 lca-st在线算法
- LCA在线算法ST&&DFS->POJ1330&&POJ1470
- bzoj 4827 [Hnoi2017]礼物
- MySQL配置binlog
- java——打印流PrintStream和PrintWriter
- const的意义
- jsp--5.jstl
- lca的ST算法(在线)
- 礼物
- JavaScript的继承方式——原型链
- while(1)与while(表达式)
- JLINK V9 修复小记
- win7 64位 C51 HEX自动转成BIN文件
- 电容容值的大小关系
- 简单模式匹配C语言版
- 多旋翼飞行器电机转动方向大全