LCA演算法模板

2021-08-28 07:27:47 字數 1075 閱讀 7601

#include#include#include#include#define ll long long

using namespace std ;

/*lac演算法模板

題目: poj - how far way ?

複雜度(n + k ) k 次詢問

雙鏈式前向星 (乙個建圖 乙個回答)

*/int n , m ;

const int maxn = 100500;

int head[maxn] ; // 鏈式前向星

int dis[maxn] ; // 用於記錄路徑之和(用法; 有頭節點一直往下累加 , dis[v] 表示從節點1到v的距離)

int pre[maxn] ; // 並查集函式

int lac[maxn] ; // 用於記錄公共祖先是誰

int _head[maxn] ;

int ans[maxn] , ans1[maxn] ;

int vis[maxn] ; // vis標記 ,因為是雙向邊,不加vis標記會造成死迴圈

int par[maxn] ;

struct edgeedge[maxn ];

struct nodest[maxn];

int cnt = 0 , tot = 0;

int find(int x)

void init()

}void add(int u , int v , int w)

void add_pro(int u , int v , int num )

void tarjin(int u)

}for(int i = _head[u] ; i != -1 ; i = st[i].next)

}}int main()

for(int i = 0 ; i < q ; i++)

// cout << kk[0] << endl ;

for(int i = 1 ; i <= n ; i++) }

for(int i = 0 ; i < q ; i++)

} return 0 ;

}

lca倍增演算法模板

時間限制 1 sec 記憶體限制 128 mb 提交 244 解決 36 提交 狀態 給一棵樹,節點數為n 1 n 250,000 和q 0 q 100,000 個詢問,對於每個詢問求出所求兩點的最近公共祖先 第一行 節點數n 以下n行,第i 1行 點i的父親節點father i 假定根的父親是0 ...

演算法模板 LCA(最近公共祖先)

實現的功能如下 在乙個n個點的無環圖中,共有n 1條邊,m個訪問中每次詢問兩個點的距離 原理 既然n個點,n 1條邊,則說明這是一棵樹,而且聯通。所以以1為根節點dfs建樹,然後通過求兩點的lca的方式,先求得最近公共祖先,然後再通過深度來求出兩點距離 1 type 2 point node 3 n...

倍增LCA模板

注意!本篇題解不適合初學lca的同學學習,因為我講的很爛很不清楚。倍增,顧名思義,就是成倍增加的意思。我們知道,任何乙個數字都可以表示成二進位制。那麼對於一條長度為n的鏈,我們總是可以跳大概logn次到達最後。對於鏈上任意一點,我們都可以在大概logn的複雜度下詢問到,其實倍增的思路就是二分,和快速...