博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LCA倍增模板
阅读量:5163 次
发布时间:2019-06-13

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

#include
#include
#include
#include
using namespace std; int n,m,Q; int head[100005],p; struct edge{int to,next,w;}e[200005]; void addedge(int u,int v,int w) { e[++p].to=v;e[p].w=w;e[p].next=head[u];head[u]=p; e[++p].to=u;e[p].w=w;e[p].next=head[v];head[v]=p; } int d[100005],anc[100005][20],dis[100005]; void dfs(int u,int fa) { for(int i=head[u];i;i=e[i].next){ int v=e[i].to,w=e[i].w; if(v==fa)continue; d[v]=d[u]+1; anc[v][0]=u; dis[v]=dis[u]+w; dfs(v,u); } } void init() { for(int j=1;j<=18;j++) for(int i=1;i<=n;i++)anc[i][j]=anc[anc[i][j-1]][j-1]; } int LCA(int u,int v) { if(d[u]
=0;i--) if(d[anc[u][i]]>=d[v])u=anc[u][i]; if(u==v)return u; for(int i=18;i>=0;i--) if(anc[u][i]!=anc[v][i])u=anc[u][i],v=anc[v][i]; return anc[u][0];} int main() { scanf("%d%d",&n,&m); for(int i=1;i<=m;i++){ int u,v,w; scanf("%d%d%d",&u,&v,&w); addedge(u,v,w); } d[1]=1;dfs(1,0);init(); scanf("%d",&Q); while(Q--){ int u,v;scanf("%d%d",&u,&v); printf("%d\n",dis[u]+dis[v]-2*dis[LCA(u,v)]); } return 0;}

转载于:https://www.cnblogs.com/Neworld2002/p/8461580.html

你可能感兴趣的文章
hdu 3065 病毒侵袭持续中
查看>>
JDBC反射
查看>>
android上传文件到服务器
查看>>
JavaScript学习笔记——语法基础1.1
查看>>
我回答了90%的面试题,为什么还被拒?
查看>>
Html - Table 表头固定和 tbody 设置 height 在IE不起作用的解决
查看>>
20165205 学习基础与C语言基础调查
查看>>
iOS SVN终端指令
查看>>
Linux如何更新软件源
查看>>
NYOJ-289 苹果 又是一个典型的01背包和上题一样没啥好说的
查看>>
HDU 2262 回溯算法 递归枚举
查看>>
九度0J 1374 所有员工年龄排序
查看>>
listview初始化后仍为空
查看>>
无刷新分页
查看>>
SIFT算法
查看>>
git各种撤销操作
查看>>
每天努力一点之SQL
查看>>
UINavigationBar-使用总结
查看>>
夺命雷公狗jquery---11属性操作
查看>>
linux 常用命令
查看>>