#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的複雜度下詢問到,其實倍增的思路就是二分,和快速...