給出一棵樹,每次給出三個點x,y
,zx,
y,z,求哪乙個點與這三個點的距離之和最近。
首先,很明顯的一件事情是:給出一棵樹上的三個點,這三個點中總有兩個的lca
lca是一樣的。
證明:好吧這個證明並不嚴謹,但是再仔細想一想就會發現是對的。假設我們能找到乙個點,這個點的左子樹中有2個標記點,右子樹中有1個標記點(或者左子樹1個,右子樹2個),那麼很明顯左子樹中的兩個點分別與右子樹的點取lca
lca的結果是一樣的,都是選擇的點。
那麼如果我們找不到這樣的點,那麼就只有這三個點在一條鏈上可能。
那麼如果這三個點在一條鏈上,那麼很明顯在下面的兩個點與在上面的點取lca
lca的結果是一樣的。都是上面那個點。
證畢。
所以,答案很明顯就出來了。三個lca
lca中不同的那個就是最佳位置。
#include
#include
#include
#define n 500100
#define lg 20
using
namespace std;
int n,m,tot,head[n]
,f[n]
[lg+1]
,dep[n]
,l1,l2,l3;
struct edge
e[n*2]
;int in;
char ch;
intread()
//快讀,不加好像會t
void
add(
int from,
int to)
void
dfs(
int x,
int fa)
}int
lca(
int x,
int y)
return f[x][0
];}int
main()
dep[0]
=-1;
dfs(1,
0);for
(int i=
1;i<=m;i++
)return0;
}
洛谷 4281 緊急集合
歡樂島上有個非常好玩的遊戲,叫做 緊急集合 在島上分散有n個等待點,有n 1條道路連線著它們,每一條道路都連線某兩個等待點,且通過這些道路可以走遍所有的等待點,通過道路從乙個點到另乙個點要花費乙個遊戲幣。參加遊戲的人三人一組,開始的時候,所有人員均任意分散在各個等待點上 每個點同時允許多個人等待 每...
P4281 AHOI2008 緊急集合 聚會
題意描述 link 歡樂島上有個非常好玩的遊戲,叫做 緊急集合 在島上分散有 n 個等待點,有 n 1 條道路連線著它們,每一條道路都連線某兩個等待點,且通過這些道路可以走遍所有的等待點,通過道路從乙個點到另乙個點要花費乙個遊戲幣。參加遊戲的人三人一組,開始的時候,所有人員均任意分散在各個等待點上 ...
P4281 AHOI2008 緊急集合 聚會
給定一棵樹,邊權為 1 多次詢問,給出三個點 a,b,c 求三個點的中點和到中點的總距離 定義中點為 x 滿足 dis a,x dis b,x dis c,x 最小 除錯日誌 jump 陣列開小,只開了 19 首先是樹上兩點距離 dis x,y dep x dep y 2 dep lca x,y 根...