CodeVs.2370 小机房的树 ( LCA 倍增 最近公共祖先)
来源:互联网 发布:新丰县网络问政平台 编辑:程序博客网 时间:2024/06/05 04:11
CodeVs.2370 小机房的树 ( LCA 倍增 最近公共祖先)
题意分析
小机房有棵焕狗种的树,树上有N个节点,节点标号为0到N-1,有两只虫子名叫飘狗和大吉狗,分居在两个不同的节点上。有一天,他们想爬到一个节点上去搞基,但是作为两只虫子,他们不想花费太多精力。已知从某个节点爬到其父亲节点要花费 c 的能量(从父亲节点爬到此节点也相同),他们想找出一条花费精力最短的路,以使得搞基的时候精力旺盛,他们找到你要你设计一个程序来找到这条路,要求你告诉他们最少需要花费多少精力
首先用倍增处理树形结构,维护树的前缀和,求的LCA后做差即可。
代码总览
#include <cstdio>#include <algorithm>#include <cstring>#include <cmath>#define nmax 100000#define demen 25using namespace std;int fa[nmax][demen],dis[nmax],head[nmax],dep[nmax];int n,m,tot = 0;struct node{ int to; int next; int w;}edge[nmax];void add(int u, int v, int w){ edge[tot].to = v; edge[tot].next = head[u]; edge[tot].w = w; head[u] = tot++;}void dfs(int rt,int f){ fa[rt][0] = f; for(int i = 1;i<=20;++i){ fa[rt][i] = fa[fa[rt][i-1]][i-1]; } for(int i = head[rt];i!=-1;i = edge[i].next){ int nxt = edge[i].to; if(nxt != f){ dis[nxt] = dis[rt] + edge[i].w; dep[nxt] = dep[rt] + 1; dfs(nxt,rt); } }}int lca(int x, int y){ int X = x,Y=y; if(dep[x] < dep[y]) swap(x,y); int dre = dep[x] - dep[y]; for(int i = 20;i>=0;--i){ if((1<<i) & dre) x = fa[x][i]; } if(x == y) return(abs(dis[X] - dis[Y])); for(int i = 20;i>=0;--i){ if(fa[x][i] != fa[y][i]){ x = fa[x][i],y = fa[y][i]; } } return(dis[X]+dis[Y] - 2*dis[fa[x][0]]);}void init(){ memset(fa,0,sizeof fa); memset(head,-1,sizeof head); memset(dis, 0, sizeof dis); memset(dep,0,sizeof dep); tot = 0;}int main(){ init(); int n,u,v,w; scanf("%d",&n); for(int i = 0;i<n-1;++i){ scanf("%d %d",&u,&v); add(u,v,1); add(v,u,1); } dep[1] = 1; dfs(1,0); int k = 0; scanf("%d",&k); for(int i = 0;i<k;++i){ scanf("%d %d",&u,&v); printf("%d\n",lca(u,v)); } return 0;}
阅读全文
0 0
- CodeVs.2370 小机房的树 ( LCA 倍增 最近公共祖先)
- LCA(最近公共祖先 Tarjan) CodeVs-2370-小机房的树
- codevs —— 2370 小机房的树 倍增LCA
- Codevs 2370 小机房的树 LCA 树上倍增
- 树上两点最近公共祖先LCA的倍增算法 poj1986
- 最近公共祖先 LCA 倍增算法
- 最近公共祖先(LCA)---倍增法
- 最近公共祖先(LCA):倍增
- 最近公共祖先 LCA 倍增+Tarjan实现
- poj 1986 最近公共祖先 (lca 倍增)
- 最近公共祖先LCA倍增算法
- 倍增法求最近公共祖先 lca
- LCA(最近公共祖先)倍增算法
- 最近公共祖先 LCA 倍增算法
- 【LCA倍增模板】【poj1330】最近公共祖先
- [LCA][CODEVS 2370]小机房的树
- codevs 2370 小机房的树 (lca)
- CodeVs.1036 商务旅行 ( LCA 最近公共祖先 )
- 《利用Python进行数据分析》第一章读书笔记
- Redis安装
- HDU 6098 Inversion (思维 17多校第六场)
- 2017 Multi-University Training Contest 6 solutions 1003 Inversion
- 表达式求值
- CodeVs.2370 小机房的树 ( LCA 倍增 最近公共祖先)
- 僵尸进程相关内容
- 重建二叉树
- Python语法易忘&速查笔记
- RecyclerView(六)设置下拉刷新
- QAQ & ORZ
- 正则表达式基础
- Java语言程序设计(原书第10版)基础篇 第一章课后答案
- 堆排序