本題是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...