POJ 1330(LCA 倍增法模板)

2022-05-03 10:42:21 字數 1200 閱讀 5632

題意:q次詢問求兩個點u,v的lca

思路:lca模板題,首先找一下樹的根,然後dfs預處理求lca(u,v)

ac**:

1 #include2 #include3 #include4 #include5 #include

6 #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...