先暫時把模板寫出來,a幾道題再來補充
此模板也是洛谷上的一道模板題
#pragma gcc optimize(2) //o2優化#includeusing
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 代表節點...