模板 最近公共祖先(LCA)

2022-06-01 09:03:17 字數 1367 閱讀 5907

給定一棵有根多叉樹,請求出指定兩個點直接最近的公共祖先。

1.倍增,先將兩個點跳至同一高度,再同時往上跳 ( 2 ^ n )高度

2.tarjan,離線,先將所有詢問存起來,dfs一遍

3.樹鏈剖分

#include #include using namespace std;

int n, m, s, u, v, cnt;

int h[501000], to[1001000], nxt[1001000], dep[501000], lg[501000];

int f[501000][25];

inline void add_edge(const int& u, const int& v)

void dfs(const int& x)

}inline int lca(int x, int y)

int main()

dfs(s);

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

}

#include int n, m, s, u, v, cnt, n;

int h[501000], to[2001000], nxt[2001000], ans[501000], fa[501000];

inline void add_edge(const int& u, const int& v)

int find(const int& x)

void dfs(int x)

int main()

dfs(s);

for (register int i = 0; i < m; ++i) printf("%d\n", ans[i]);

}

#include #include int n, m, s, u, v, cnt;

int h[600000], nxt[1100000], to[1100000];

int f[600000], sz[600000], dep[600000], hvs[600000], top[600000];

inline void add_edge(const int& u, const int& v)

void dfs1(const int& u)

}void dfs2(const int& u, const int& tp)

inline int query(int u, int v)

int main()

f[s] = s;

dfs1(s); dfs2(s, s);

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

}

模板 最近公共祖先(LCA)

題自洛谷 如題,給定一棵有根多叉樹,請求出指定兩個點直接最近的公共祖先。輸入格式 第一行包含三個正整數n m s,分別表示樹的結點個數 詢問的個數和樹根結點的序號。接下來n 1行每行包含兩個正整數x y,表示x結點和y結點之間有一條直接連線的邊 資料保證可以構成樹 接下來m行每行包含兩個正整數a b...

模板 lca 最近公共祖先

lca hljs cpp include include using namespace std const int maxn 500001 int n,m,gen,x,y struct edgeedge 2 maxn int deep maxn fa maxn 20 deep記錄每個點的深度,fa...

最近公共祖先 LCA 模板

lca即最近公共祖先,是指 在有根樹中,找出某兩個結點u和v最近的公共祖先。時間複雜度o nlogn m n 步驟 1.將樹看作乙個無向圖,從根節點開始深搜,得到乙個遍歷序列。2.在x y區間中利用rmq演算法找到深度最小返回其下標。可以上洛谷找模板題測試 include include inclu...