ZOJ3195 Design the city [2017年6月计划 树上问题04]
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]的更多相关文章
- HDU3887 Counting Offspring [2017年6月计划 树上问题03]
Counting Offspring Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- 洛谷P3459 [POI2007]MEG-Megalopolis [2017年6月计划 树上问题02]
[POI2007]MEG-Megalopolis 题目描述 Byteotia has been eventually touched by globalisation, and so has Byte ...
- 洛谷P2912 [USACO08OCT]牧场散步Pasture Walking [2017年7月计划 树上问题 01]
P2912 [USACO08OCT]牧场散步Pasture Walking 题目描述 The N cows (2 <= N <= 1,000) conveniently numbered ...
- ZOJ3195 Design the city(LCA)
题目大概说给一棵树,每次询问三个点,问要把三个点连在一起的最少边权和是多少. 分几种情况..三个点LCA都相同,三个点有两对的LCA是某一点,三个点有两对的LCA各不相同...%……¥…… 画画图可以 ...
- [zoj3195]Design the city(LCA)
解题关键:求树上三点间的最短距离. 解题关键:$ans = (dis(a,b) + dis(a,c) + dis(b,c))/2$ //#pragma comment(linker, "/S ...
- RQNOJ PID192 梦幻大PK [2017年6月计划 二分图02]
PID192 / 梦幻大PK ☆ 提交你的代码 查看讨论和题解 你还木有做过哦 我的状态 查看最后一次评测记录 质量 7 题目评价 质量 7 ★★★★★ ★★★★☆ ★★★☆☆ ★★☆ ...
- 洛谷P1368 均分纸牌(加强版) [2017年6月计划 数论14]
P1368 均分纸牌(加强版) 题目描述 有 N 堆纸牌,编号分别为 1,2,…, N.每堆上有若干张,纸牌总数必为 N 的倍数.可以在任一堆上取1张纸牌,然后移动. 移牌规则为:在编号为 1 堆上取 ...
- 洛谷P1621 集合 [2017年6月计划 数论13]
P1621 集合 题目描述 现在给你一些连续的整数,它们是从A到B的整数.一开始每个整数都属于各自的集合,然后你需要进行一下的操作: 每次选择两个属于不同集合的整数,如果这两个整数拥有大于等于P的公共 ...
- 洛谷P1390 公约数的和 [2017年6月计划 数论12]
P1390 公约数的和 题目描述 有一天,TIBBAR和LXL比赛谁先算出1~N这N个数中每任意两个不同的数的最大公约数的和.LXL还在敲一个复杂而冗长的程序,争取能在100s内出解.而TIBBAR则 ...
随机推荐
- 自定义UICollectionViewLayout(适用于多个section)
一.自定义layout主要方法 重写系统的- (void)prepareLayout 方法: 其实就是计算每个cell的frame和其它相关属性. 二.在网上看了好多自定义的layout 但是没有多 ...
- 【JEECG-Boot 技术文档】新手入门教程
Jeecg-Boot入门教程必看(新手学习) 1.开发环境搭建 http://jeecg-boot.mydoc.io/?t=345670 开发工具 :https://pan.baidu.com/sha ...
- 操作系统命令工具Util
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.i ...
- rsync命令集合
rsync -avz rsync://logs@211.151.78.206/www_logs/2014/03/27/* /mnt/hgfs/iautoslogs/
- 如何给Apache Pig自定义UDF函数?
近日由于工作所需,需要使用到Pig来分析线上的搜索日志数据,散仙本打算使用hive来分析的,但由于种种原因,没有用成,而Pig(pig0.12-cdh)散仙一直没有接触过,所以只能临阵磨枪了,花了两天 ...
- C++面向对象高级编程(下)-Geekband
11, 组合和继承 一, Composition 复合 has-a的关系 简单来讲, 就是: class A{ classB b1; }; 这里讲到Adapter设计模式: templa ...
- window环境下Python+OpenCV配置
最近开始学习OpenCV来进行计算机视觉实验,选择了Python作为实验语言,工欲善其事,必先利其器.先总结下安装配置. 现在opencv目测只支持Python2.7X版本的,还依赖于numpy和ma ...
- 论文翻译—SPP-Net(目标检测)
SPPNet论文翻译 <Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition> Kai ...
- tinyint(1)遇到的坑
一. Mysql查询的boolean结果将输出为0或者1. 比如: select 1=1; 其输出结果为1. 二. 使用一套中间件对kafka消息进行解析为mysql 语句,其中遇到如下的问题, 目标 ...
- bzoj1003物流运输 最短路+DP
bzoj1003物流运输 题目描述 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输 ...