Tarjan演算法求LCA

2022-09-09 02:33:15 字數 1253 閱讀 9673

題源:

這個題還是debug了好久。。

1.呼叫函式中如果要更改外部資料需要傳遞引用,其實傳遞引用往往效率更高,以後要多加注意這一點。

2.忘寫並查集了(捂臉逃)

3.題目要求的是距離而不是lca,認真審題。。

貼**:

#include #include 

#include

#define maxn 100005

//#define local

using

namespace

std;

struct

edge

edge[maxn * 2], queryedge[maxn * 2]; //

兩倍儲存(不知道父子關係與遍歷的先後順序)

int head[maxn], queryhead[maxn], e1 = -1, e2 = -1, fa[maxn], vs[maxn], dep[maxn]; //

dep用來記錄深度求距離

void addedge(int *head, edge *edge, int &e, int x, int y) //

e要傳遞引用來進行更改,否則++無效

int find(int x) //

居然忘寫了。。

void tarjan(int u, int pre) //

要多傳入乙個前置節點引數以更改dep,自上往下更新

}for (int i = queryhead[u]; ~i; i =queryedge[i].next)

}}int

main()

fa[n] =n;

scanf("%d

", &q);

for (int i = 1; i <= q; ++i)

#ifdef local

//for (int i = 0; i <= e1; ++i) cout << i << " -> " << edge[i].to << endl;

#endif

dep[

0] = 0

; tarjan(

1, 0); //

根節點傳入輔助0

#ifdef local

for (int i = 1; i <= n; ++i) cout << i << "

->

"<< fa[i] <#endif

for (int i = 0; i < e2; i += 2

)

}

Tarjan演算法求LCA(最近公共祖先)

lca的離線演算法。複雜度為o n q 這個演算法充分利用了dfs樹的結構。對於每個節點u,關於它的詢問 u,v 只有兩種。假設先dfs u 後dfs v 1 v在u的子樹內。此時lca u,v u.2 v不在u的子樹內。假設v在u的父親的另一棵子樹內。此時lca u,v father u 如果不滿...

距離諮詢 tarjan求lca

農夫約翰有n 2 n 40000 個農場,標號1到n。m 2 m 40000 條的不同的垂直或水平的道路鏈結著農場,道路的長度不超過1000.這些農場的分布就像下面的地圖一樣,圖中農場用f1.f7表示 每個農場最多能在東西南北四個方向鏈結4個不同的農場。此外,農場只處在道路的兩端。道路不會交叉而且每...

LCA離線演算法tarjan

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