解決的問題:在一棵樹上求u,v的最近公共祖先。
思路:預處理parents陣列和depth陣列,首先使u,v深度相同,一起向上迭代,直至找到相同父節點
/*倍增法求lca*/
#include#include#include#includeusing namespace std;
#define n 100010
vectorg[n];
int root,depth[n];/*根節點,節點深度*/
int parents[n][25],from[n];/*parents[u][x]記錄u的2^x祖先節點,from記錄各個節點是否有父節點*/
int n,m;
void getdata()/*輸入樹*/
for(int i=1; i<=n; i++)
if(from[i]==-1) root=i;/*根節點*/
}void get_depth()/*計算每一結點的深度*/
if(v!=u)
}u=parents[u][0];/*直到u,v的父親節點相同*/
}printf("%d\n",depth[t1]-depth[u]+depth[t2]-depth[u]);
}int main()
return 0;
}
倍增法求 LCA
預處理 通過dfs遍歷,記錄每個節點到根節點的距離dist u 深度d u 並求出樹上每個節點i的2 j祖先f i j 求最近公共祖先,根據兩個節點的的深度,如不同,向上調整深度大的節點,使得兩個節點在同一層上,如果正好是祖先結束,否則,將連個節點同時上移,查詢最近公共祖先。include incl...
倍增法求lca
f i j 表示從i這個節點出發,向上走2 j步到達的點 超過了最大深度就返回0 那麼顯然有 因為相當於是從i點先向上走2 j 1 步,再走2 j 1 步。等價於一共走2 j步。然後求lca就是 先把深度大的那個點往上跳,使兩個點的深度相同。對應的 for int i 18 i 0 i if dep...
倍增法求LCA
預處理 通過dfs遍歷,記錄每個節點到根節點的距離dist u 深度d u init 求出樹上每個節點u的2 i祖先p u i 求最近公共祖先,根據兩個節點的的深度,如不同,向上調整深度大的節點,使得兩個節點在同一層上,如果正好是祖先結束,否則,將連個節點同時上移,查詢最近公共祖先。void dfs...