AHOI2008 緊急集合 LCA

2021-08-25 02:34:42 字數 1305 閱讀 6336

題目大意:給一棵樹,求三點之間最短距離, 並求最短距離所在的點。

題解:求出兩兩之間的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條道路連線著它們,每一條道路都連線某兩個等待點,且通過這些道路可以走遍所有的等待點,通過道路從乙個點到另乙個點要花費乙個遊戲幣。參加遊戲的人三人一組,開始的時候,所有人員均任意分散在各個等待點上 每個點同時允許多個人等待 每...