lca:最近公共祖先
求lca一般有用倍增的和tarjan的,
tarjan是o(n+q)的但是必須離線。
應當對於不同的題目適當選擇。
tarjan演算法的主要思想……是從要求的一對點的訪問過程求來的。
比如以乙個點u為根的多個小子樹內,不同小子樹內的點對的lca都是u。
那麼可以dfs下去,回上去的時候用並查集合並整棵子樹。
看懂網上的或者書上的資料之後**其實是很簡潔的……
模板題目**
#includeusing namespace std;
int read()
while (ch>='0' && ch<='9')
return x*f;
}const int
n=500005;
int n,m,s;
int qcnt,ecnt;
int fa[n],ans[n];
bool vis[n];
struct edgee[n<<1];int head[n];
struct queryq[n<<1];int qh[n];
int getfa(int u)
void add(int u,int v)
void add1(int u,int v,int t)
void tarjan(int u)
for (int i=qh[u];i;i=q[i].next)
}int main(){
n=read(),m=read(),s=read();
int x,y;
for (int i=1;i
LCA 離線tarjan模板
演算法引入 樹上兩點的最近公共祖先 對於有根樹的兩個結點u,v,最近公共祖先lca t,u,v 表示乙個結點x,滿足x是u,v的祖先且x的深度盡可能大 對於x來說,從u到v的路徑一定經過點x 演算法思想 tarjan lca離線演算法 tarjan演算法基於dfs的框架,對於新搜到的乙個結點,首先建...
倍增求lca(模板)
定義 lca,最近公共祖先,是指一棵樹上兩個節點的深度最大的公共祖先。也可以理解為兩個節點之間的路徑上深度最小的點。我們這裡用了倍增的方法求了lca。我們的基本的思路就是,用dfs遍歷求出所有點的深度。f i j 陣列用來求的是距離節點i,距離2 j的祖先。可以知道,f i 0 就是它的直接父親。然...
ST求LCA的模板
預處理的時間複雜度是 o nlog2n 查詢時間是 o 1 include include include using namespace std const int maxn 10010 int rmq 2 maxn rmq陣列,就是尤拉序列對應的深度序列 struct st for int j ...