最近公共祖先(LCA) RMQ解決

2021-08-10 11:57:24 字數 998 閱讀 4808

洛谷p3379

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

輸入格式:

第一行包含三個正整數n、m、s,分別表示樹的結點個數、詢問的個數和樹根結點的序號。

接下來n-1行每行包含兩個正整數x、y,表示x結點和y結點之間有一條直接連線的邊(資料保證可以構成樹)。

接下來m行每行包含兩個正整數a、b,表示詢問a結點和b結點的最近公共祖先。

輸出格式:

輸出包含m行,每行包含乙個正整數,依次為每乙個詢問的結果。

輸入樣例#1:

5 5 4

3 12 4

5 11 4

2 43 2

3 51 2

4 5

輸出樣例#1:

441

44

#include

#include

#include

#include

#define m 500000*2+10

#define n 500000*2+10

using namespace std;

struct node

e[m];

int tot,st[m];//tot 邊的編號 

//st【i】表示從i出發的最後一條邊的編號 

int n,m,root,x,y;//n條邊  m次詢問 root為根節點 

int f[n][20];

int dfs_list[n],depth[n],first[n];

//dfs_list【】尤拉跡

//depth【i】表示dfs_list[i]的深度

//first【now】表示now節點在尤拉跡中出現的第乙個位置 

void add(int x,int y)//鄰接表 

int pow_2(int j)

}int rmq_query(int l,int r)

}main()

}

最近公共祖先LCA RMQ轉化

1,最近公共祖先 lca 對於有根樹t的兩個結點u v,最近公共祖先lca t,u,v 表示乙個結點x,滿足x是u v的祖先且x的深度盡可能大。2,lca問題向rmq問題的轉化方法 rmq返回最值的下標 對樹進行深度優先遍歷,每當 進入 或回溯到某個結點時,將這個結點的深度存入陣列dfsnum最後一...

最近公共祖先 python 最近公共祖先

lca演算法樸素演算法 也就是我們所說的暴力演算法,大致的思路是從樹根開始,往下迭代,如果當前結點比兩個結點都小,那麼說明要從樹的右子樹中找 相反則從左子樹中查詢 直到找到乙個結點在當前結點的左邊,乙個在右邊,說明當前結點為最近公共祖先,如果乙個結點是另外乙個結點的祖先,那麼返回前面結點的父親結點即...

最近公共祖先 LCA 最近公共祖先

直接暴力搜尋參考 普通搜尋每次查詢都需要 樸素演算法是一層一層往上找,倍增的話直接預處理出乙個 具體做法是 維護乙個 的關係來線性求出這個陣列 int anc n 31 int dep n 記錄節點深度 void dfs int u,int parent for int i 0 i g u size...