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 #include2using
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 大家如果知道樹的話,應該就知道父親節點與兒子節點了吧,那麼祖先就是父親的父親的父親的 總之在同一條樹鏈上...