P3379 模板 最近公共祖先(LCA優化)

2021-09-22 02:05:25 字數 755 閱讀 1101

本題是lca的模板,lca大概有三種解法:dfs、倍增、tarjan。如果不了解的可以先移步:dfs+st、倍增法。tarjan並不熟悉,所以用了倍增的模板,但是我的第一次提交超時了,去網上搜了一下發現是我儲存圖的結構不好。我用的是簡單的鄰接表,但是本題的點數多達500000,鄰接表在這種情況下複雜度太高了。於是專門去學習了一種時空複雜度很好的結構:鏈式前向星,這種結構很好地減少了深搜的時間。而且理解起來並不困難,實現起來也很簡單。**如下:

#include#include#includeusing namespace std;

const int maxn=500005;

int root,n,m,a,b,c;

//儲存圖結構

struct node

e[2*maxn];

int head[maxn];

int cnt;

void add(int a,int b)

//遍歷圖,求出各節點的深度,並求出fa陣列

int fa[maxn][20],dep[maxn];

void dfs(int root,int pre)

if(a==b)

return a;

for(int i=19;i>=0;i--)

}return fa[a][0];

}int main()

dfs(root,0);

while(m--)

return 0;

}

P3379 模板 最近公共祖先(LCA)

如題,給定一棵有根多叉樹,請求出指定兩個點直接最近的公共祖先。第一行包含三個正整數n m s,分別表示樹的結點個數 詢問的個數和樹根結點的序號。接下來n 1行每行包含兩個正整數x y,表示x結點和y結點之間有一條直接連線的邊 資料保證可以構成樹 接下來m行每行包含兩個正整數a b,表示詢問a結點和b...

P3379 模板 最近公共祖先(LCA)

如題,給定一棵有根多叉樹,請求出指定兩個點直接最近的公共祖先。第一行包含三個正整數n m s,分別表示樹的結點個數 詢問的個數和樹根結點的序號。接下來n 1行每行包含兩個正整數x y,表示x結點和y結點之間有一條直接連線的邊 資料保證可以構成樹 接下來m行每行包含兩個正整數a b,表示詢問a結點和b...

P3379 模板 最近公共祖先(LCA)

如題,給定一棵有根多叉樹,請求出指定兩個點直接最近的公共祖先。輸入輸出格式 輸入格式 第一行包含三個正整數n m s,分別表示樹的結點個數 詢問的個數和樹根結點的序號。接下來n 1行每行包含兩個正整數x y,表示x結點和y結點之間有一條直接連線的邊 資料保證可以構成樹 接下來m行每行包含兩個正整數a...