題目大意:給一棵樹,求三點之間最短距離, 並求最短距離所在的點。
題解:求出兩兩之間的lca,觀察可以發現,有兩個lca是相同的,且這個點一定在所有lca中深度最淺。
畫乙個圖可以發現,集合點就是另乙個lca,因為這個點是這三個點互相路徑連線起來的公共點。
至於距離,找個例子可以發現距離是dep
[a]+
dep[
b]+d
ep[c
]−de
p[lc
a1]−
dep[
lca2
]−de
p[lc
a3
]dep[a] + dep[b] + dep[c] - dep[lca1] - dep[lca2] - dep[lca3]
dep[a]
+dep
[b]+
dep[
c]−d
ep[l
ca1]
−dep
[lca
2]−d
ep[l
ca3]
,剛好是乙個輪換式。。。所以答案就是他了
#include
#include
#include
#include
using
namespace std;
const
int maxn =
500001
;const
int maxm =
500001
;int fir[maxn]
, nxt[maxm <<1]
, to[maxm <<1]
, cnt;
int dep[maxn]
, fa[maxn][20
];inline
intread()
while
(ch >=
'0'&& ch <=
'9')
return k * f;
}inline
void
add_edge
(int a,
int b)
void
dfs(
int u,
int f)
}int
lca(
int x,
int y)
intmain()
dep[0]
=-1;
dfs(1,
0);for
(int i =
1; i <= m; i++
)}
AHOI2008 緊急集合 聚會
歡樂島上有個非常好玩的遊戲,叫做 緊急集合 在島上分散有n個等待點,有n 1條道路連線著它們,每一條道路都連線某兩個等待點,且通過這些道路可以走遍所有的等待點,通過道路從乙個點到另乙個點要花費乙個遊戲幣。參加遊戲的人三人一組,開始的時候,所有人員均任意分散在各個等待點上 每個點同時允許多個人等待 每...
AHOI2008 緊急集合 聚會
歡樂島上有個非常好玩的遊戲,叫做 緊急集合 在島上分散有n個等待點,有n 1條道路連線著它們,每一條道路都連線某兩個等待點,且通過這些道路可以走遍所有的等待點,通過道路從乙個點到另乙個點要花費乙個遊戲幣。參加遊戲的人三人一組,開始的時候,所有人員均任意分散在各個等待點上 每個點同時允許多個人等待 每...
AHOI2008 緊急集合 聚會
歡樂島上有個非常好玩的遊戲,叫做 緊急集合 在島上分散有n個等待點,有n 1條道路連線著它們,每一條道路都連線某兩個等待點,且通過這些道路可以走遍所有的等待點,通過道路從乙個點到另乙個點要花費乙個遊戲幣。參加遊戲的人三人一組,開始的時候,所有人員均任意分散在各個等待點上 每個點同時允許多個人等待 每...