题目链接:http://codeforces.com/contest/832/problem/D

题目大意:在一个无向图上,给出三个点,以其中一个点为终点,另外两个点为起点,请问如何安排起点和终点可以使得从两个起点走最短路到终点所共同经过的路径的长度最长?

解题思路:任取一个点作为根建立一棵树(为什么可以建成一棵树?它不会有环吗?请看题目中的这一句:“The underground has n stations connected with n - 1 routes so that each route connects two stations, and it is possible to reach every station from any other.”),要求树中任意两点x,y的距离,其实只要先求出两点的公共祖先u,然后其距离便是 |depth[x]+depth[y]-2*depth[u]| 。对于一组确定的终点和起点,其共同路径长度就是 (dis(s1,t) + dis(s2,t) - dis(s1,s2))/2+1 (不理解的话稍微画一下图,至于为什么+1?根节点也要算哦亲)。具体请看代码(模板来自《挑战》)。

AC代码:

  

 #include <cstdio>
#include <vector>
#include <cmath>
using namespace std;
const int maxn=1e5+;
vector<int> G[maxn];
int log_max_v;
int parent[][maxn];
int depth[maxn],s[];
int n,q;
void dfs(int v,int p,int d){
parent[][v]=p;
depth[v]=d;
for(int i=;i<G[v].size();i++){
if(G[v][i]!=p) dfs(G[v][i],v,d+);
}
}
void init(){
dfs(,-,);
for(int k=;k+<;k++){
for(int v=;v<=n;v++){
if(parent[k][v]<) parent[k+][v]=-;
else parent[k+][v]=parent[k][parent[k][v]];
}
}
}
int lca(int u,int v){
if(depth[u]>depth[v]) swap(u,v);
for(int k=;k<;k++){
if((depth[v]-depth[u])>>k&){
v=parent[k][v];
}
}
if(u==v) return u;
for(int k=;k>=;k--){
if(parent[k][u]!=parent[k][v]){
u=parent[k][u];
v=parent[k][v];
}
}
return parent[][u];
}
int dis(int a,int b){
int u=lca(a,b);
return abs(depth[a]+depth[b]-depth[u]*);
}
int main()
{
scanf("%d%d",&n,&q);
int p;
for(int i=;i<=n;i++){
scanf("%d",&p);
G[i].push_back(p);
G[p].push_back(i);
}
init();
while(q--){
for(int i=;i<;i++)
scanf("%d",&s[i]); int ans=;
for(int i=;i<;i++){
int a=(i+)%,b=(i+)%;
int temp=(dis(s[a],s[i])+dis(s[b],s[i])-dis(s[a],s[b]))/;
if(temp>ans) ans=temp;
}
printf("%d\n",ans+);
} return ;
}

CF832D的更多相关文章

  1. CF832D Misha, Grisha and Underground

    有一棵n个节点的树,一共q 次询问 每次询问给定3个点,求两条起点终点在这三个点上且不完全重合的路径的最多公共节点数 简单LCA求距离,令a为汇合点,那么答案就是(dis(a,b) + dis(a,c ...

  2. CF832D题解

    题目传送门 Description 给定一棵树上的三个点 \(a,b,c\),你要制定两条起点和终点都在这三个点中的路径,使得两条路径重叠的节点最多. Solution 感觉我的方法和大众不同,显然是 ...

随机推荐

  1. js 运动函数篇 (一) (匀速运动、缓冲运动、多物体运动、多物体不同值运动、多物体多值运动)层层深入

    前言:         本人纯小白一个,有很多地方理解的没有各位大牛那么透彻,如有错误,请各位大牛指出斧正!小弟感激不尽.         本篇文章为您分析一下原生JS写 匀速运动.缓冲运动.多物体运 ...

  2. 标准库ConfigParser模块

    用于生成和修改常见配置文档,当前模块的名称在 python 3.x 版本中变更为 configparser. 来看一个好多软件的常见文档格式如下: 1 2 3 4 5 6 7 8 9 10 11 12 ...

  3. jQuery学习(二)

    操作DOM对象: 修改文本: jQuery对象的text()和html()方法可以用来获取节点的文本内容和HTML文本.而当你给方法传入参数时,这两个方法可以被用于设置jQuery的文本内容. 还是以 ...

  4. 使用mvp+rxjava+retrofit加载数据

    将mvp和rxjava和retrofit简单整合的列子,让activity的代码不再那么臃肿,只负责显示数据. 关于mvp的介绍可以看这里, 关于Rxjava的介绍可以看这里; 关于retrofit的 ...

  5. CodeForces - 1245A Good ol' Numbers Coloring (思维)

    Codeforces Round #597 (Div. 2 Consider the set of all nonnegative integers: 0,1,2,-. Given two integ ...

  6. 跟哥一起学python(4)- 数据类型之Number

    本节我们开始学习python的数据类型. 什么是数据类型呢?前面我们提过,所谓的编程,就是控制一系列的数据去完成我们预设的逻辑或者功能.所以,编程语言首先要定义一系列对“数据”的处理规则.这些处理规则 ...

  7. libevent(二)尾队列 && 最小堆

    本文主要研究libevent中用来存储事件的两个结构体. 尾队列 具体定义位于queue.h中. #define TAILQ_HEAD(name, type) \ struct name { \ st ...

  8. 算法——Java实现栈

    栈 定义: 栈是一种先进后出的数据结构,我们把允许插入和删除的一端称为栈顶,另一端称为栈底,不含任何元素的栈称为空栈 栈的java代码实现: 基于数组: import org.junit.jupite ...

  9. 数位dp H - F(x) HDU - 4734

    http://acm.hdu.edu.cn/showproblem.php?pid=4734 一般数位dp表示的是数的性质,这个题目也是一样,但是我们求出来的是一个函数的值,怎么把这个值转化成一类数, ...

  10. sshd: no hostkeys available — exiting

    在开启SSHD服务时报错.sshd re-exec requires execution with an absolute path用绝对路径启动,也报错如下:Could not load host ...