2370 小机房的树

时间限制: 1 s

空间限制: 256000 KB

题目等级 : 钻石 Diamond

传送门

题目描述 Description

小机房有棵焕狗种的树,树上有N个节点,节点标号为0到N-1,有两只虫子名叫飘狗和大吉狗,分居在两个不同的节点上。有一天,他们想爬到一个节点上去搞基,但是作为两只虫子,他们不想花费太多精力。已知从某个节点爬到其父亲节点要花费 c 的能量(从父亲节点爬到此节点也相同),他们想找出一条花费精力最短的路,以使得搞基的时候精力旺盛,他们找到你要你设计一个程序来找到这条路,要求你告诉他们最少需要花费多少精力

输入描述 Input Description

第一行一个n,接下来n-1行每一行有三个整数u,v, c 。表示节点 u 爬到节点 v 需要花费 c 的精力。

第n+1行有一个整数m表示有m次询问。接下来m行每一行有两个整数 u ,v 表示两只虫子所在的节点

输出描述 Output Description

一共有m行,每一行一个整数,表示对于该次询问所得出的最短距离。

样例输入 Sample Input

3

1 0 1

2 0 1

3

1 0

2 0

1 2

样例输出 Sample Output

1

1

2

数据范围及提示 Data Size & Hint

1<=n<=50000, 1<=m<=75000, 0<=c<=1000

分类标签 Tags

最近公共祖先 图论

/*
LCA模板+带权最短路.
处理的时候只需把边权连起来即可.
(dis[u]=dis[v]+e[i].next).
然后套LCA模板.
fa数组开到D+5即可.
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define MAXN 50001
#define MAXM 75001
#define D 21
using namespace std;
int n,m,dis[MAXN],tot,fa[MAXN][D+5],head[MAXM],deep[MAXN];
struct data
{
int x;
int v;
int next;
}e[MAXM<<1];
void add(int u,int v,int x)
{
e[++tot].v=v;
e[tot].x=x;
e[tot].next=head[u];
head[u]=tot;
}
void dfs(int u,int x)
{
deep[u]=x;
for(int i=head[u];i!=-1;i=e[i].next)
{
int v=e[i].v;
if(!deep[v]&&v)
{
fa[v][0]=u;
dis[v]=dis[u]+e[i].x;//dis处理.
dfs(v,x+1);
}
}
}
void get_father()
{
for(int j=1;j<=D;j++)
for(int i=0;i<n;i++)
{
fa[i][j]=fa[fa[i][j-1]][j-1];
}
}
int get_same(int u,int v)
{
for(int i=0;i<=D;i++)
if((1<<i)&v) u=fa[u][i];
return u;
}
int lca(int u,int v)
{
int tot=0;
if(deep[u]<deep[v]) swap(u,v);
u=get_same(u,deep[u]-deep[v]); for(int i=D;i>=0;i--)
{
if(fa[u][i]!=fa[v][i])
{
u=fa[u][i];
v=fa[v][i];
}
}
if(u==v) return u;
return fa[u][0];
}
int main()
{
int x,y,z;
memset(head,-1,sizeof(head));
scanf("%d",&n);
for(int i=1;i<n;i++)
{
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
add(y,x,z);
}
dfs(0,0);
get_father();
dis[0]=0;
int u,v;
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&u,&v);
int ans=lca(u,v);
if(ans==u)
printf("%d\n",dis[v]-dis[u]);
else printf("%d\n",dis[u]+dis[v]-2*dis[ans]);
}
return 0;
}

Codevs 2370 小机房的树的更多相关文章

  1. CodeVs.2370 小机房的树 ( LCA 倍增 最近公共祖先)

    CodeVs.2370 小机房的树 ( LCA 倍增 最近公共祖先) 题意分析 小机房有棵焕狗种的树,树上有N个节点,节点标号为0到N-1,有两只虫子名叫飘狗和大吉狗,分居在两个不同的节点上.有一天, ...

  2. LCA(倍增在线算法) codevs 2370 小机房的树

    codevs 2370 小机房的树 时间限制: 1 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题目描述 Description 小机房有棵焕狗种的树,树上有N个节点, ...

  3. codevs——2370 小机房的树

    2370 小机房的树  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description 小机房有棵焕狗种的树,树上有N个 ...

  4. Codevs 2370 小机房的树 LCA 树上倍增

    题目描述 Description 小机房有棵焕狗种的树,树上有N个节点,节点标号为0到N-1,有两只虫子名叫飘狗和大吉狗,分居在两个不同的节点上.有一天,他们想爬到一个节点上去搞基,但是作为两只虫子, ...

  5. 放一道比较基础的LCA 的题目把 :CODEVS 2370 小机房的树

    题目描述 Description 小机房有棵焕狗种的树,树上有N个节点,节点标号为0到N-1,有两只虫子名叫飘狗和大吉狗,分居在两个不同的节点上.有一天,他们想爬到一个节点上去搞基,但是作为两只虫子, ...

  6. codevs 2370 小机房的树(LCA)

    过了这么长的时间终于开始看LCA了... 有一次训练题卡在LCA当时不会...拖了好久好久...其实现在还是不会... 只会tarjan... 传送门 板子题咯 tarjan的算法就是基于先序遍历的顺 ...

  7. 小机房的树 codevs 2370

    2370 小机房的树  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description 小机房有棵焕狗种的树 ...

  8. 【codevs2370】小机房的树 LCA 倍增

    2370 小机房的树  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题目描述 Description 小机房有棵焕狗种的树,树上有N个节点,节点标号为0 ...

  9. codevs2370 小机房的树 x

    2370 小机房的树  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond   题目描述 Description 小机房有棵焕狗种的树,树上有N个节点,节点标号 ...

随机推荐

  1. ACM2032

    杨辉三角 Problem Description 还记得中学时候学过的杨辉三角吗?具体的定义这里不再描述,你可以参考以下的图形:11 11 2 11 3 3 11 4 6 4 11 5 10 10 5 ...

  2. jsf服务器端验证用户输入

    服务器端验证用户输入数据步骤 1 html页面上插入要输入数据控件 <h:inputText size="10" value="#{commodityBean.fo ...

  3. HW4.40

    public class Solution { public static void main(String[] args) { long positiveSide = 0; long negativ ...

  4. UVa10635 - Prince and Princess(LCS转LIS)

    题目大意 有两个长度分别为p+1和q+1的序列,每个序列中的各个元素互不相同,且都是1~n^2之间的整数.两个序列的第一个元素均为1.求出A和B的最长公共子序列长度. 题解 这个是大白书上的例题,不过 ...

  5. 计算json的和

      var count=0;    for(var i=0;i<data.length;i++){        count+=data[i].data;   }

  6. 解决linux redhat6下安装git的问题

    今天用到linux上的git安装过程比较曲折,记录一下: 首先会报需要perl rpm -ivh git-1.7.1-14.2.x86_64.rpm warning: git-1.7.1-14.2.x ...

  7. ios调打电话代码

    // 定义点击拨号按钮时的操作 - (void)callAction{ NSString *number = @"";// 此处读入电话号码 // NSString *num = ...

  8. zTree实现地市县三级级联DAO接口实现

    zTree实现地市县三级级联DAO接口实现 ProvinceDaoImpl.java: /** * @Title:ProvinceDaoImpl.java * @Package:com.gwtjs.d ...

  9. android109 结构体,联合体,枚举,自定义

    #include <stdio.h> #include <stdlib.h> void study(){ printf("吃饭睡觉打李志\n"); } // ...

  10. MySQL DBA教程:Mysql性能优化之缓存参数优化

      在平时被问及最多的问题就是关于 MySQL 数据库性能优化方面的问题,所以最近打算写一个MySQL数据库性能优化方面的系列文章,希望对初中级 MySQL DBA 以及其他对 MySQL 性能优化感 ...