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

2022-05-16 17:36:08 字數 867 閱讀 1370

先暫時把模板寫出來,a幾道題再來補充

此模板也是洛谷上的一道模板題

#pragma gcc optimize(2) //o2優化#include 

using

namespace

std;

typedef

long

long

ll;const

int l = 30;//

2的指數的大小

const

int nn = 1e6+10

;int

n,m,s;

ll bit[l];

int depth[nn];//

depth[i]:節點i在樹上的深度

int fa[nn][l]; //

fa[i][j]:節點i向上走2^j次方的節點

vector g[nn];//

存圖 void init_log()

void dfs(int u,int par)

for(auto v: g[u])

}}int lca(int a,int

b) }

//此時a,b已經是相同的深度

if(a == b) return a; //

如果a,b節點已經相同,所以a,b所在的節點就是lca

for(int i = l-1;i>=0;i--)

}return fa[a][0]; //

返回lca的兒子的父親,也就是lca

}int

main()

dfs(s,0);

inta,b;

for(int i = 1;i<=m;i++)

return0;

}

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

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 descr...

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

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

節點的最近公共祖先(LCA倍增法)

樹是一種很常見的資料結構。現在蒜頭君面臨乙個問題,在乙個有 n 個節點的樹上,節點編號分別是1 n。蒜頭想知道一些節點之間的最近公共祖先是那些節點。輸入格式 第一行輸入乙個整數 n 2 n 10,000 表示樹上有 n 個節點。接下來的 n 1 行,每行輸入倆個整數 a,b 1 a,b n 代表節點...