模板 LCA 最近公共祖先 倍增法

2022-05-05 22:54:12 字數 1703 閱讀 9460

2019-11-07 09:25:45

c.樹之呼吸-叄之型-樹上兩點路徑長度

time limit: 1000 ms

memory limit: 32768 k

total submit: 7 (4 users)

total accepted: 2 (2 users)

special judge: no

description

給一棵 n 個結點的樹,結點編號從 1 到 n,並指定 m 號結點為根;

給出 q 個詢問,每次詢問從編號為 x 的結點到編號為 y 的結點的路徑長度。

input

輸入第一行為乙個正整數 t,表示測試資料組數;

對於每組測試資料,輸入第一行為三個正整數 n、m、q,表示樹的結點數,根結點的編號以及詢問數;

接下來 n - 1 行給出樹的結構,每行兩個正整數 x、y,表示結點 x 與結點 y 有邊相連;

接下來 q 行給出詢問,每行兩個正整數 x、y,表示詢問從結點 x 到結點 y 的路徑長度;

1 <= t <= 20,1 <= n,q <= 1e5,1 <= m <= n。

output

每組測試資料的第一行輸出「case #i:」(不含引號),表示是第 i 組測試資料;

接下來 q 行,每行輸出乙個整數,表示給出的兩結點間的路徑長路。

sample input

25 2 3

1 45 4

2 43 2

1 35 2

4 13 1 2

1 21 3

1 12 3

sample output

case #1:32

1case #2:02

author

陳鑫最近公共祖先lca模板題,

ans=deep[x]-deep[lca(x,y)]+deep[y]-deep[lca(x,y)];

1 #include2

using

namespace

std;

3const

int amn=2e5+5

;4 vectoreg[amn];

5int n,m,maxh,deep[amn],anc[amn][20]; ///

maxh為樹的最大深度=(int)log2(n)+1,deep為結點的深度,anc為距離結點x路徑長度為2^i的結點是哪個

6 queueq;78

void bfs(int

rt)20}21

}22int lca(int x,int

y) ///

找x和y的lca

27return anc[x][0]; ///

輸出lca28}

29void init(int

rt)35

intmain()

45init(m);

46 printf("

case #%d:\n

",case++);

47while(q--)52}

53}54/**55

題意: 給一棵 n 個結點的樹,結點編號從 1 到 n,並指定 m 號結點為根;

56給出 q 個詢問,每次詢問從編號為 x 的結點到編號為 y 的結點的路徑長度。

57思路:求出x和y的最近公共祖先,答案是x到最近公共祖先的深度+y到最近公共祖先的深度58*

*/

LCA最近公共祖先 倍增法筆記

先暫時把模板寫出來,a幾道題再來補充 此模板也是洛谷上的一道模板題 pragma gcc optimize 2 o2優化 include using namespace std typedef long long ll const int l 30 2的指數的大小 const int nn 1e6 ...

倍增法求lca(最近公共祖先)

基本上每篇部落格都會有參考文章,一是彌補不足,二是這本身也是我學習過程中找到的覺得好的資料 大致上演算法的思路是這樣發展來的。想到求兩個結點的最小公共祖先,我們可以先把兩個的深度提到同一水平,在一步一步往上跳,直到兩個結點有了乙個公共祖先,依照演算法流程,這就是least common ancest...

講解 模板 最近公共祖先(LCA)(倍增)

閱讀須知 我認為讀者已經掌握 或了解 了 倍增思想 樹 圖 的基本概念及簡單實現 存圖與建圖 dfs 嗯,我們來看看最近公共祖先 lca 的一種實現方式 倍增。話說什麼是最近公共祖先呢?emmm 大家如果知道樹的話,應該就知道父親節點與兒子節點了吧,那麼祖先就是父親的父親的父親的 總之在同一條樹鏈上...