首页 > 试题广场 >

聚会

[编程题]聚会
Y岛风景美丽宜人,气候温和,物产丰富。Y岛上有N个城市,有N-1条城市间的道路连接着它们。每一条道路都连接某两个城市。幸运的是,小可可通过这些道路可以走遍Y岛的所有城市。神奇的是,乘车经过每条道路所需要的费用都是一样的。
小可可,小卡卡和小YY经常想聚会,每次聚会,他们都会选择一个城市,使得三个人到达这个城市的总费用最小。
由于他们计划中还会有很多次聚会,每次都选择一个地点是很烦人的事情,所以他们决定把这件事情交给你来完成。他们会提供给你地图以及若干次聚会前他们所处的位置,希望你为他们的每一次聚会选择一个合适的地点。

输入描述:
第一行两个正整数,N和M。分别表示城市个数和聚会次数;
后面有N-1行,每行用两个正整数A和B表示编号为A和编号为B的城市之间有一条路。城市的编号是从1到N的;
再后面有M行,每行用三个正整数表示一次聚会的情况:小可可所在的城市编号,小卡卡所在的城市编号以及小YY所在的城市编号。


输出描述:
一共有M行,每行两个数P和C,用一个空格隔开。表示第i次聚会的地点选择在编号为P的城市,总共的费用是经过C条道路所花费的费用。
示例1

输入

6 4
1 2
2 3
2 4
4 5
5 6
4 5 6
6 3 1
2 4 4
6 6 6

输出

5 2
2 5
4 1
6 0

备注:
的数据中,
的数据中,
头像 ThinkofBlank
发表于 2020-04-19 19:37:00
这道题莫名眼熟,于是马上猜到了结论: 对于一棵树中,要求到三个点x,y,z总距离最小的点,那么,这个点一定是 lca(x,y),lca(x,z),lca(y,z)这三个点中的一个(一开始我还算了lca(x,y,z),后来发现好像不用。。。) 所以,我们可以打个lca,每次再比较下到哪个点距离最小即可 展开全文
头像 Fyyg
发表于 2020-04-19 15:00:11
这道题,我一看就蒙了,竟然考这样赤裸裸的LCA,我也是醉了。。。最近公共祖先(LCA)让我们轻而易举地想到了Tarjan+倍增算法来使用。本人代码如下:#include<bits/stdc++.h>using namespace std;const int N=500003,L=19;i 展开全文