題意:q次詢問求兩個點u,v的lca
思路:lca模板題,首先找一下樹的根,然後dfs預處理求lca(u,v)
ac**:
1 #include2 #include3 #include4 #include5 #include6 #include
7 #include8 #include9 #include10
using
namespace
std;
11 typedef long
long
ll;12
const
int maxbit = 15;13
const
int maxn = 1e4+5
;14 vectorg[maxn];
15int
depth[maxn];
16int
fa[maxn][maxbit];
17int
log[maxn];
18int
n;19
void
pre()
24void dfs(int cur,int father)
30for(int i = 0;i)34}
35}36int lca(int u,int
v)42
if(u == v) return u;//
如果u倍增到v,說明v是u的lca
43for(int i = log[depth[u]];i>=0;i--)48}
49return fa[u][0];//
最終結果為u v向上一層就是lca
50}
51int
main()
5263 memset(in,0,sizeof(in
));64
intu,v;
65for(int i = 0;i1;i++)
71for(int i = 1;i<=n;i++)76}
77 dfs(root,0
);78 scanf("
%d%d
",&u,&v);
79int ans =lca(u,v);
80 printf("
%d\n
",ans);81}
82return0;
83}84
poj1330 LCA離線演算法
模版參考 題目 給定一棵樹,求兩個結點的最近公共祖先。最基礎的lca問題 include include include using namespace std const int maxn 10006 int dp maxn 15 father maxn dep maxn bool hash ma...
poj1330(LCA最近公共祖先)
題意 求最近公共祖先 思路 之前學習了樹鏈剖分,然後我就用樹鏈剖分的一小部分知識就可以解這個題目了,記錄每個結點的fa和depth。然後查詢時,每次將depth大的結點往上走直到x y。如下 include include include include include include includ...
LCA倍增法模板
deg其實應該寫成depth吧,存的是每個結點的深度,dfs的過程是為了處理出每個結點的深度,用遞推式計算出fa u i 其中f u i 表示u的第2 i個祖先 基本思想是 d i 表示 i節點的深度,p i,j 表示 i 的 2 j 倍祖先 那麼就有乙個遞推式子 p i,j p p i,j 1 j...