Design the city


Time Limit: 1 Second      Memory Limit: 32768 KB

Cerror is the mayor of city HangZhou. As you may know, the traffic system of this city is so terrible, that there are traffic jams everywhere. Now, Cerror finds out that the main reason of them is the poor design of the roads distribution, and he want to change this situation.

In order to achieve this project, he divide the city up to N regions which can be viewed as separate points. He thinks that the best design is the one that connect all region with shortest road, and he is asking you to check some of his designs.

Now, he gives you an acyclic graph representing his road design, you need to find out the shortest path to connect some group of three regions.

Input

The input contains multiple test cases! In each case, the first line contian a interger N (1 < N < 50000), indicating the number of regions, which are indexed from 0 to N-1. In each of the following N-1 lines, there are three interger Ai, Bi, Li (1 < Li < 100) indicating there's a road with length Li between region Ai and region Bi. Then an interger Q (1 < Q < 70000), the number of group of regions you need to check. Then in each of the following Q lines, there are three interger Xi, Yi, Zi, indicating the indices of the three regions to be checked.

Process to the end of file.

Output

Q lines for each test case. In each line output an interger indicating the minimum length of path to connect the three regions.

Output a blank line between each test cases.

Sample Input

4
0 1 1
0 2 1
0 3 1
2
1 2 3
0 1 2
5
0 1 1
0 2 1
1 3 1
1 4 1
2
0 1 2
1 0 3

Sample Output

3
2 2
2

Author: HE, Zhuobin

Source: ZOJ Monthly, May 2009

三个点的距离等于任意两点间距离加和除以2

#include <cstdio>
#include <cstring>
#include <iostream>
#include <cstdlib>
inline void read(int &x)
{
char ch = getchar();char c = ch;x = 0;
while(ch < '0' || ch > '9')c = ch, ch = getchar();
while(ch <= '9' && ch >= '0')x = x * 10 + ch - '0', ch = getchar();
if(c == '-')x = -x;
}
inline void swap(int& a, int& b){int tmp = a;a = b;b = tmp;}
const int MAXN = 50000 + 10;
struct Edge{int u,v,w,next;}edge[MAXN << 1];
int head[MAXN], cnt, n, m;
inline void insert(int a,int b, int c){edge[++cnt] = Edge{a,b,c,head[a]};head[a] = cnt;}
int log2[MAXN], pow2[30];
int p[30][MAXN], deep[MAXN], len[MAXN];int b[MAXN]; void dfs(int u)
{
for(int pos = head[u];pos;pos = edge[pos].next)
{
int v = edge[pos].v;
if(b[v])continue;
b[v] = true;
len[v] = len[u] + edge[pos].w;
deep[v] = deep[u] + 1;
p[0][v] = u;
dfs(v);
}
} inline void yuchuli()
{
b[1] = true;
deep[1] = 0;
dfs(1);
for(register int i = 1;i <= log2[n];i ++)
for(register int j = 1;j <= n;j ++)
p[i][j] = p[i - 1][p[i - 1][j]];
} inline int lca(int va, int vb)
{
if(deep[va] < deep[vb])swap(va,vb);
for(register int i = log2[n];i >= 0;i --)
if(deep[va] - pow2[i] >= deep[vb])
va= p[i][va];
if(va == vb)return va;
for(register int i = log2[n];i >= 0;i --)
{
if(p[i][va] != p[i][vb])
{
va = p[i][va];
vb = p[i][vb];
}
}
return p[0][va];
} inline int l(int va, int vb)
{
int k = lca(va, vb);
return len[va] + len[vb] - (len[lca(va, vb)] << 1);
} int main()
{
register int tmp1,tmp2,tmp3;
log2[0] = -1;
for(register int i = 1;i <= MAXN;++ i)log2[i] = log2[i >> 1] + 1;
pow2[0] = 1;
for(register int i = 1;i <= 30;++ i)pow2[i] = pow2[i - 1] << 1;
bool ok = false;
while(scanf("%d", &n) != EOF)
{
if(ok)putchar('\n'),putchar('\n');
cnt = 0;memset(head, 0, sizeof(head));
memset(edge, 0, sizeof(edge));
memset(deep, 0, sizeof(deep));
memset(p, 0, sizeof(p));m = 0;
memset(b, 0, sizeof(b));
memset(len, 0, sizeof(len));
for(register int i = 1;i < n;++ i)
{
read(tmp1);read(tmp2);read(tmp3);
insert(tmp1 + 1, tmp2 + 1, tmp3);
insert(tmp1 + 1, tmp1 + 1, tmp3);
}
yuchuli();
read(m);
read(tmp1);read(tmp2);read(tmp3);
++ tmp1;++ tmp2;++ tmp3;
printf("%d", (l(tmp1, tmp2) + l(tmp2, tmp3) + l(tmp1, tmp3))>> 1);
for(register int i = 2;i <= m;++ i)
{
read(tmp1);read(tmp2);read(tmp3);
tmp1 ++;tmp2 ++;tmp3 ++;
int a = l(tmp1, tmp2);int b = l(tmp2, tmp3);int c = l(tmp1, tmp3);
printf("\n%d", (l(tmp1, tmp2) + l(tmp2, tmp3) + l(tmp1, tmp3))>> 1);
}
ok = true;
}
return 0;
}

ZOJ3195 Design the city [2017年6月计划 树上问题04]的更多相关文章

  1. HDU3887 Counting Offspring [2017年6月计划 树上问题03]

    Counting Offspring Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  2. 洛谷P3459 [POI2007]MEG-Megalopolis [2017年6月计划 树上问题02]

    [POI2007]MEG-Megalopolis 题目描述 Byteotia has been eventually touched by globalisation, and so has Byte ...

  3. 洛谷P2912 [USACO08OCT]牧场散步Pasture Walking [2017年7月计划 树上问题 01]

    P2912 [USACO08OCT]牧场散步Pasture Walking 题目描述 The N cows (2 <= N <= 1,000) conveniently numbered ...

  4. ZOJ3195 Design the city(LCA)

    题目大概说给一棵树,每次询问三个点,问要把三个点连在一起的最少边权和是多少. 分几种情况..三个点LCA都相同,三个点有两对的LCA是某一点,三个点有两对的LCA各不相同...%……¥…… 画画图可以 ...

  5. [zoj3195]Design the city(LCA)

    解题关键:求树上三点间的最短距离. 解题关键:$ans = (dis(a,b) + dis(a,c) + dis(b,c))/2$ //#pragma comment(linker, "/S ...

  6. RQNOJ PID192 梦幻大PK [2017年6月计划 二分图02]

    PID192 / 梦幻大PK ☆ 提交你的代码 查看讨论和题解 你还木有做过哦 我的状态         查看最后一次评测记录 质量 7 题目评价 质量 7 ★★★★★ ★★★★☆ ★★★☆☆ ★★☆ ...

  7. 洛谷P1368 均分纸牌(加强版) [2017年6月计划 数论14]

    P1368 均分纸牌(加强版) 题目描述 有 N 堆纸牌,编号分别为 1,2,…, N.每堆上有若干张,纸牌总数必为 N 的倍数.可以在任一堆上取1张纸牌,然后移动. 移牌规则为:在编号为 1 堆上取 ...

  8. 洛谷P1621 集合 [2017年6月计划 数论13]

    P1621 集合 题目描述 现在给你一些连续的整数,它们是从A到B的整数.一开始每个整数都属于各自的集合,然后你需要进行一下的操作: 每次选择两个属于不同集合的整数,如果这两个整数拥有大于等于P的公共 ...

  9. 洛谷P1390 公约数的和 [2017年6月计划 数论12]

    P1390 公约数的和 题目描述 有一天,TIBBAR和LXL比赛谁先算出1~N这N个数中每任意两个不同的数的最大公约数的和.LXL还在敲一个复杂而冗长的程序,争取能在100s内出解.而TIBBAR则 ...

随机推荐

  1. Python学习day02 - 编程分类和Pycharm和Jupyter的安装

    编程语言分类 编程语言是用来和计算机交互的,计算机只认识0和1 机器语言(低级语言) 直接和硬件交互 用0和1和计算机沟通 优点:执行效率最高 缺点:开发效率低 汇编语言直接和硬件交互 优点(相较于机 ...

  2. 编写函数处理user_list,新方法

    写函数,完成以下功能: # 例如有: user_list=[ {"name": "alex","hobby":"抽烟"} ...

  3. [NOI2003]逃学的小孩【观察+树的直径】

    Online Judge:Bzoj1509,Luogu P4408 Label:观察,树的直径 题目描述 输入 第一行是两个整数N(\(3≤N≤200000\))和M,分别表示居住点总数和街道总数.以 ...

  4. 跟我一起在Win10中用VMware安装Ubuntu

    VMware下安装Ubuntu 打开VMware,创建虚拟机: 点击运行虚拟机,报错为 解决办法为 大功告成,我们已经在Win10中用VMware安装Ubuntu了

  5. 跟我一起实战美团网一之[nodemon] app crashed - waiting for file changes before starting...

    环境准备 第一步安装 npm install -g npx npx create-nuxt-app at-app 与事件相关的包我们再安装一次 npm install --update-binary ...

  6. centos Python2.6 升级到2.7

    需求: centos 6.x 系统默认Python 版本都是2.6,实际生产环境中需要用到Python 2.7.x Python 2.7 下载地址 [root@ansible package]# wg ...

  7. mysql备份时的快照原理

    实际上实验的结果表明,这里的 the first such read指的是:对同一个表或者不同表进行的第一次select语句建立了该事务中一致性读的snapshot. 其它update, delete ...

  8. LUOGU P4195 Spoj3105 Mod

    题面 bsgs问题.因为p可能不为质数,所以我们将原先解题的式子变形 每次除以p与a的最大公约数,直到最大公约数为1或b不能整除为止 代码 #include<iostream> #incl ...

  9. JavaSE_07_Collection接口的List和Set

    1.1 List接口介绍 java.util.List接口继承自Collection接口,是单列集合的一个重要分支 List接口特点: 它是一个元素存取有序的集合.例如,存元素的顺序是1.2.3.那么 ...

  10. php连接数据库插入数据

    <form action="updata.php" method="post"> 姓名:<input type="text" ...