尋找最近公共祖先可以說是樹結構裡相當基礎的知識了。最近學了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...