倍增法求 LCA

2021-08-04 07:10:54 字數 882 閱讀 5178

預處理:通過dfs遍歷,記錄每個節點到根節點的距離dist[u],深度d[u]

並求出樹上每個節點i的2^j祖先f[i][j]

求最近公共祖先,根據兩個節點的的深度,如不同,向上調整深度大的節點,使得兩個節點在同一層上,如果正好是祖先結束,否則,將連個節點同時上移,查詢最近公共祖先。

#include 

#include

#include

#include

#include

#include

#include

using

namespace

std;

struct node *first[100001], a[200001];

int n, m, f[100001][21], l, dist[100001], d[100001], c[100001];

inline

void makelist(int x, int y, int z)

int lca(int x, int y)

int main()

memset(f, 0, sizeof(f));

memset(dist, 255, sizeof(dist));

dist[1] = 0; c[1] = 1; d[1] = 0;

for (int k = 1, l = 1; l <= k; l++)

}for (int i = 1; i <= 20; i++)

for (int j = 1; j <= n; j++)

if (f[j][i - 1]) f[j][i] = f[f[j][i - 1]][i - 1];

for (; m--; )

倍增法求lca

f i j 表示從i這個節點出發,向上走2 j步到達的點 超過了最大深度就返回0 那麼顯然有 因為相當於是從i點先向上走2 j 1 步,再走2 j 1 步。等價於一共走2 j步。然後求lca就是 先把深度大的那個點往上跳,使兩個點的深度相同。對應的 for int i 18 i 0 i if dep...

倍增法求LCA

解決的問題 在一棵樹上求u,v的最近公共祖先。思路 預處理parents陣列和depth陣列,首先使u,v深度相同,一起向上迭代,直至找到相同父節點 倍增法求lca include include include includeusing namespace std define n 100010 ...

倍增法求LCA

預處理 通過dfs遍歷,記錄每個節點到根節點的距離dist u 深度d u init 求出樹上每個節點u的2 i祖先p u i 求最近公共祖先,根據兩個節點的的深度,如不同,向上調整深度大的節點,使得兩個節點在同一層上,如果正好是祖先結束,否則,將連個節點同時上移,查詢最近公共祖先。void dfs...