tajan離線求LCA 模板

2021-08-07 10:03:28 字數 826 閱讀 3155

lca:最近公共祖先

求lca一般有用倍增的和tarjan的,

tarjan是o(n+q)的但是必須離線。

應當對於不同的題目適當選擇。

tarjan演算法的主要思想……是從要求的一對點的訪問過程求來的。

比如以乙個點u為根的多個小子樹內,不同小子樹內的點對的lca都是u。

那麼可以dfs下去,回上去的時候用並查集合並整棵子樹。

看懂網上的或者書上的資料之後**其實是很簡潔的……

模板題目**

#includeusing namespace std;

int read()

while (ch>='0' && ch<='9')

return x*f;

}const int

n=500005;

int n,m,s;

int qcnt,ecnt;

int fa[n],ans[n];

bool vis[n];

struct edgee[n<<1];int head[n];

struct queryq[n<<1];int qh[n];

int getfa(int u)

void add(int u,int v)

void add1(int u,int v,int t)

void tarjan(int u)

for (int i=qh[u];i;i=q[i].next)

}int main(){

n=read(),m=read(),s=read();

int x,y;

for (int i=1;i

LCA 離線tarjan模板

演算法引入 樹上兩點的最近公共祖先 對於有根樹的兩個結點u,v,最近公共祖先lca t,u,v 表示乙個結點x,滿足x是u,v的祖先且x的深度盡可能大 對於x來說,從u到v的路徑一定經過點x 演算法思想 tarjan lca離線演算法 tarjan演算法基於dfs的框架,對於新搜到的乙個結點,首先建...

倍增求lca(模板)

定義 lca,最近公共祖先,是指一棵樹上兩個節點的深度最大的公共祖先。也可以理解為兩個節點之間的路徑上深度最小的點。我們這裡用了倍增的方法求了lca。我們的基本的思路就是,用dfs遍歷求出所有點的深度。f i j 陣列用來求的是距離節點i,距離2 j的祖先。可以知道,f i 0 就是它的直接父親。然...

ST求LCA的模板

預處理的時間複雜度是 o nlog2n 查詢時間是 o 1 include include include using namespace std const int maxn 10010 int rmq 2 maxn rmq陣列,就是尤拉序列對應的深度序列 struct st for int j ...