題源:
這個題還是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 是指在一棵樹中,距離兩個點最近的兩者的公共節點。也就是說,在兩個點通往根的道路上,肯定會有公共的節點,我們就是要求找到公共的節點中,深度盡量深的點。還可以表示成另一種說法,就是如果把樹看成是乙個圖,這找到這兩個點中的最短距離。本文先介...