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的演算法,它是基於樹鏈剖分的...