演算法 LCA tarjan 倍增

2022-08-13 22:54:10 字數 1362 閱讀 9323

呃,這個常用但是我一直不會

tar

jan'>tarjan

ta

rjan

'>tarjan 演算法基於 dfs ,在 dfs 的過程中,對於每個節點位置的詢問做出相應的回答。

//

tarjian,邊建邊 邊回答問題

#include#include

#include

using

namespace

std;

intn,m,rt;

const

int n=500003,m=500003

;int

ans[m];

vector

e[n];

struct

node

node(){}

};vector

q[n];

intfa[n];

int find(int

x)bool

vis[n];

void dfs(int x,int

f) vis[x]=true

;

sz=q[x].size();

for(int i=0;i)

}int

main()

倍增

就從父親更新到兒子

#include#include

#include

#include

using

namespace

std;

intn,q;

const

int n=100003,q=10003

;int fa[n][21],dep[n];//

輔助陣列dep

vector g[n];

bool

tag[n];

void dfs(int

x)int

lg[n];

void

get_log()

int lca(int u,int

v)

if(u==v) return

u;

for(int i=lg[dep[u]]-1;i>=0;i--)

if(fa[u][i]!=fa[v][i])

u=fa[u][i],v=fa[v][i];

return fa[u][0];}

intmain()

get_log();

scanf("%d

",&q);

while(q--)

return0;

}

LCA Tarjan及倍增模板 POJ 1330

我目前學會的兩種求lca的演算法 a tarjan演算法 離線演算法 演算法思路 1 從根結點開始dfs。2 遍歷點x的所有子節點。3 從某乙個子節點y返回x時,要在並查集中把x,y所在的兩棵子樹合併,且根節點為點x所在子樹的根節點。4 離開結點x前,要看看是否有與x相關的詢問 x,y 如果有且結點...

複習LCA Tarjan演算法

解題報告 輸入描述的很恐怖,其實用scanf getchar也可以很簡單就寫出來,用tarjan演算法要注意,統計祖先的時候要想清楚,不要重複統計和少統計了。比如 2 解題報告 這個題構樹要用雙向邊,然後dfs時做訪問標記,根節點可以任意選擇乙個,雖然不同的根節點會導致同一對點的祖先不同,但是它們之...

LCA tarjan演算法 模版

lca演算法 lca least common ancestor 顧名思義,是指在一棵樹中,距離兩個點最近的兩者的公共節點。也就是說,在兩個點通往根的道路上,肯定會有公共的節點,我們就是要求找到公共的節點中,深度盡量深的點。還可以表示成另一種說法,就是如果把樹看成是乙個圖,這找到這兩個點中的最短距離...