最近公共祖先LCA模板(Tarjan RMQ)

2021-07-27 10:45:15 字數 1345 閱讀 2220

給定一棵有根多叉樹,請求出指定兩個點直接最近的公共祖先。

洛谷p3379 【模板】最近公共祖先(lca)

每次想陣列名字都想的異常艱難,於是(因果關係?)這裡存一下模板

#include

#include

#include

#include

using

namespace

std;

int father[500005],visited[500005];

int n,m,s;

int head[500005],cnt=0,head1[500005],cnt1=0;

struct nodeedges[1000005];

void addedge(int u,int v)

struct node1edges1[1000005];

void addedge1(int u,int v)

int getfather(int x)

void _union(int x,int y)

void tarjan(int u)

}for(int i=head1[u];~i;i=edges1[i].next)

}}int main()

for(int i=1;i<=m;i++)

tarjan(s);

for(int i=0;i<2*m;i+=2)

return

0;}

這個感覺容易爆記憶體,至少在交洛谷模板題的時候是qwq

#include

#include

#include

#include

#include

#define min(a,b) (ausing namespace std;

int n,m,s;

int head[500005],cnt=0,first[500005],dep[1000005];

int vertex[1000005],rmq[1000005][20],dfs_clock=0;

bool visited[500005];

struct nodeedges[1000005];

void add(int u,int v)

void dfs(int u,int depth)

}}void rmqinit()

}int rmq(int

x,int

y)int main()

dfs(s,1);

rmqinit();

for(int i=1;i<=m;i++)

return

0;}

模板 最近公共祖先(LCA)

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

模板 lca 最近公共祖先

lca hljs cpp include include using namespace std const int maxn 500001 int n,m,gen,x,y struct edgeedge 2 maxn int deep maxn fa maxn 20 deep記錄每個點的深度,fa...

最近公共祖先 LCA 模板

lca即最近公共祖先,是指 在有根樹中,找出某兩個結點u和v最近的公共祖先。時間複雜度o nlogn m n 步驟 1.將樹看作乙個無向圖,從根節點開始深搜,得到乙個遍歷序列。2.在x y區間中利用rmq演算法找到深度最小返回其下標。可以上洛谷找模板題測試 include include inclu...