【codevs 1036】商务旅行
来源:互联网 发布:java string类源码分析 编辑:程序博客网 时间:2024/06/05 19:35
lca
#include<cstdio>#include<iostream>#include<algorithm>#include<queue>#include<cmath>#include<cstring>using namespace std;const int maxn=30000+5;int fa[maxn][25],deep[maxn],dist[maxn];int n,m,tot,first[maxn],next[maxn<<1];struct edge{ int f,t,v;}es[maxn<<1];void build(int f,int t,int v){ es[++tot]=(edge){f,t,v}; next[tot]=first[f]; first[f]=tot;}void init(int q,int h){ for(int i=first[h];i;i=next[i]) { int at=es[i].t,av=es[i].v; if(at==q) continue; fa[at][0]=h; dist[at]=dist[h]+av; deep[at]=deep[h]+1; init(h,at); }}void make_lca(){ for(int i=1;i<=log2(n);i++) for(int j=1;j<=n;j++) fa[j][i]=fa[fa[j][i-1]][i-1];}int lca(int x,int y){ if(deep[x]<deep[y]) swap(x,y); for(int i=log2(m);i>=0;i--) { if(deep[fa[x][i]]>=deep[y]) x=fa[x][i]; } if(x==y) return x; for(int i=log2(n);i>=0;i--) { if(fa[x][i]!=fa[y][i]) { x=fa[x][i]; y=fa[y][i]; } } return fa[x][0];}int main(){ scanf("%d",&n); for(int i=1;i<n;i++) { int v,u; scanf("%d%d",&v,&u); build(v,u,1); build(u,v,1); } init(1,1); make_lca(); scanf("%d",&m); int ans=0; for(int i=1;i<=m;i++) { int a,la; scanf("%d",&a); if(i==1) la=a; else { ans+=dist[a]+dist[la]-2*(dist[lca(a,la)]); la=a; } } printf("%d\n",ans); return 0;}
阅读全文
0 0
- Codevs 1036 商务旅行
- 【codevs 1036】商务旅行
- Codevs 1036 商务旅行
- codevs 1036 商务旅行
- 【codevs 1036】商务旅行
- 【codevs 1036】商务旅行
- codevs 1036 商务旅行 (lca)
- codevs 1036 商务旅行 题解报告
- codevs 1036 商务旅行 (LCA)
- 【LCA 倍增法】【codevs 1036 商务旅行】
- Codevs 1036:商务旅行——题解
- CodeVs.1036 商务旅行 ( LCA 最近公共祖先 )
- codevs 1036 商务旅行 LCA 解题报告
- Codevs P1036 商务旅行
- 1036商务旅行
- 1036 商务旅行
- 1036 商务旅行
- 1036 商务旅行
- 第一篇
- web安全方向
- Coursera吴恩达《神经网络与深度学习》课程笔记(1)-- 深度学习概述
- Codeforces Round #431 (Div. 2) From Y to Y
- Codeforces Tell Your World
- 【codevs 1036】商务旅行
- Guava Cache使用笔记
- git 如何正确的提交文件
- cf 849B
- 欢迎使用CSDN-markdown编辑器
- git 使用详细介绍
- 快速排序及c++实现
- 大话设计模式之一:如何在visual studio 中建立C#程序
- 绑定开发者-小程序开发设置2-微信小程序开发-视频教程9