求LCA(最近公共祖先)

2021-07-26 15:35:00 字數 1358 閱讀 5463

演算法1:樹上倍增

//hdu 2586

#include

#include

#include

#define maxn 40000+5

#define inf 999999999

using

namespace

std;

int n,m,t,q,head[maxn],x,y,z,vis[maxn],fa[maxn],cost[maxn],dep[maxn],maxcost[maxn][20],anc[maxn][20];

struct xxb[maxn];

void add(int u,int v,int q)

; head[u]=m;

}int dfs(int t)

int st()

for (int j=1;(1

}int query(int p,int q)

ans+=maxcost[p][0]+maxcost[q][0];

return ans;

}int main()

}return

0;}

演算法2:tarjan

include #include 

#include

#define maxn 80000+5

using

namespace

std;

int q,dis[maxn],t,x,y,z,n,m,num,head[maxn],vis[maxn],fa[maxn],h[maxn],ans[maxn];

struct xxb[maxn];

struct yyb2[405];

void add(int u,int v,int q)

; head[u]=m;

}void _add(int u,int v,int q)

; h[u]=num;

}int find(int x)

int dfs(int t,int val)

for (int k=h[t];k!=0;k=b2[k].next)

if (vis[b2[k].v])

return0;}

int main()

vis[1]=1;dfs(1,0);

for (int i=1;i<=q;i++) printf("%d\n",ans[i]);

}return

0;}

被資料坑得很慘,開始先寫了倍增,陣列只開了40000,但是神奇的a了。so後來寫tarjan時也只開了40000,一直re不明所以,找了很久錯qaq……然後把陣列開了兩倍大(雙向邊)就沒有然後了……

LCA 求最近公共祖先

洛谷3379 基本思路 要求兩個點的最近公共祖先,首先我們用乙個陣列fa x i 來表示節點x的向上2 i層的祖先編號,先dfs求出每個點的深度和預處理fa陣列。再求兩個節點的最近公共祖先時,先讓深度大的跳到相同的一層,再嘗試以log2 depth x 的跨度跳至祖先節點,相同時不跳 因為可能不是最...

LCA求最近公共祖先

parent i j 表示節點u的第2 j個祖先 dis i dfs時間戳,即節點到根節點距離,即深度 const int pow 18 const int maxn 5e5 10 int parent maxn pow 10 parent i j 表示節點u的第2 j個祖先 vectoredge ...

最近公共祖先 LCA 最近公共祖先

直接暴力搜尋參考 普通搜尋每次查詢都需要 樸素演算法是一層一層往上找,倍增的話直接預處理出乙個 具體做法是 維護乙個 的關係來線性求出這個陣列 int anc n 31 int dep n 記錄節點深度 void dfs int u,int parent for int i 0 i g u size...