POJ1330 最近公共祖先

2021-07-02 07:54:02 字數 691 閱讀 2917

尋找最近公共祖先可以說是樹結構裡相當基礎的知識了。最近學了vector,正好可以派上用場。

本題採用雙重鍊錶並行上找的方式。即對於兩個節點u和v,若u的層次比v深,則u去尋找父親,否則v去尋找父親,直至u=v。

程式中的fa陣列用來記錄父節點,step用以記錄層次,a用以記錄某一節點的兒子。函式中的findroot()用以尋找根節點,build()用於建立樹結構,注意使用迭代器時需加上「vector :: iterator i」。

**如下:

#include

#include

#include

#include

using

namespace

std;

const

int maxn=10005;

int t,n,fa[maxn],step[maxn];

vector

a[maxn];

int findroot()

}}void build(int ste,int root)

int find(int u,int v)

else

}return u;

}void init()

build(0,findroot());

cin>>u>>v;

cout

poj1330(LCA最近公共祖先)

題意 求最近公共祖先 思路 之前學習了樹鏈剖分,然後我就用樹鏈剖分的一小部分知識就可以解這個題目了,記錄每個結點的fa和depth。然後查詢時,每次將depth大的結點往上走直到x y。如下 include include include include include include includ...

最近公共祖先 python 最近公共祖先

lca演算法樸素演算法 也就是我們所說的暴力演算法,大致的思路是從樹根開始,往下迭代,如果當前結點比兩個結點都小,那麼說明要從樹的右子樹中找 相反則從左子樹中查詢 直到找到乙個結點在當前結點的左邊,乙個在右邊,說明當前結點為最近公共祖先,如果乙個結點是另外乙個結點的祖先,那麼返回前面結點的父親結點即...

最近公共祖先 LCA 最近公共祖先

直接暴力搜尋參考 普通搜尋每次查詢都需要 樸素演算法是一層一層往上找,倍增的話直接預處理出乙個 具體做法是 維護乙個 的關係來線性求出這個陣列 int anc n 31 int dep n 記錄節點深度 void dfs int u,int parent for int i 0 i g u size...