基本的LCA問題的實現

2021-04-24 06:30:47 字數 735 閱讀 3188

lca問題可以歸約為rmq問題求解。

歸約方法為:做一次dfs(euler tour),在dfs過程中,記錄三個陣列的值:

e[i]:在euler tour過程中途經的結點編號

l[i]:在euler tour過程中途經的結點的層次(從根結點算起的深度)

rmq問題可以有多種實現方法,本程式採用了sparse table方法。

//lca problem.

#include

#include

using namespace std;

const int maxn = 110, maxnlg = 16;

struct node ;

node *tree[maxn];

int e[2*maxn], l[2*maxn], r[maxn], visit[maxn];

int st[2*maxn][maxnlg];

int n, m;    //n:number of nodes, m:number of edges

int cnt;     //counter for the euler tour

void init()

}void dfs(int i, int depth)

}void process1()

void process2(int m[2*maxn][maxnlg], int a[2*maxn], int n)

return 0;

}

LCA問題的RMQ解法解析

lca問題是指最近公共祖先問題,rmq問題是只區間最小值問題,我們可以將lca問題轉化為rmq問題,然後利用rmq的解法來解決lca問題。有關rmq問題的詳解可以參考我的部落格,有關於rmq問題的詳解。本部落格重點講如何將lca問題轉化為rmq問題。當我們深度遍歷樹時,我們沒遇到乙個未訪問過的節點就...

求解LCA問題的幾種方式

這篇隨筆講解圖論中lca問題 最近公共祖先 的幾種求解方式及實現方法。lca問題屬於高階圖論,所以希望讀者學習過初級圖論,知道圖的一些基本知識,並懂得深搜演算法的實現方式。這樣理解本篇部落格將會快捷 舒適。理解lca問題,理解節點深度是至關重要的,大家可以畫一棵樹。在一棵樹中,所有的節點都有乙個深度...

LCA的樹鏈剖分實現

這篇本來是要在 樹鏈剖分小節 中寫的,但是我感覺這只是樹鏈剖分的乙個衍生物,所以另開了一篇,如果對樹鏈剖分部分還不是太了解,請看上面的鏈結。計算樹中兩個節點的最近公共祖先,我們一般有爬山法,tarjan離線演算法,或者是將lca轉換成rmq來解,這裡講一講一種新的求lca的演算法,它是基於樹鏈剖分的...