LCA兩種方法

2021-07-26 20:21:39 字數 1661 閱讀 6719

lca(least common ancestors),即最近公共祖先,是指在有根樹中,找出某兩個結點u和v最近的公共祖先。
模板題

anc[i][j]表示第i個點的2^j的祖先的標號

整個過程就是兩個點往上跳到同一深度,再一起往上跳找到lca

#include

#include

using

namespace

std;

int n,m,root,anc[500009][21];

int edge_num,head[1000009],deep[500009];

struct eedge[1000009];

inline

void swap(int &a,int &b)

inline

int read()

while(ch>='0'&&ch<='9')

return x*flag;

}void addedge(int x,int y)

void dfs(int x,int fa)

}void preanc()}}

}int lca(int x,int y)

if(x==y) return x;

for(i=maxlog;i>=0;i--)

}return anc[x][0];

}int main()

dfs(root,0);

preanc();

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

return

0;}

tarjan是人名

思想是dfs找到某條路最深的點,將其加入並查集,祖先為自己,然後回溯;將上乙個點也加入並查集,共同祖先為上乙個點。。。不斷進行此操作

再dfs過程中不斷加入新的點到並查集中,同時檢查有沒有一組問答已經在並查集內,如果有,輸出一組答案

#include

using

namespace

std;

int n,m,root,edge_num,ask_num;

int fa[500010],head[1200000],h1[1200000],ans[500010];

bool b[500010];

struct eedge[1200000];

struct aask[1200000];

void addedge(int x,int y)

void addask(int x,int y,int z)

int find(int x)

/*void union(int a,int b)*/

void lca(int x)

}int k;

for(j=h1[x];j;j=ask[j].next)

}}void out()

}int main()

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

lca(root);

out();

return

0;}

相比之下,tarjan比lca要快幾乎一倍,但倍增可以在兩點到lca的路上很容易地搞事情,比如noip2013 day1 t3

post get 兩種方法

a.定義乙個get函式 get url,headers none defget url,headers none return urlrequests url,headers headers 內部可以呼叫urlrequests 如果不寫headers headers會被預設為none b.定義乙個p...

popup的兩種方法

1,popup var pop function window.onload function aaa function closediv 2,div var divtop,divleft,divwidth,divheight,docheight,docwidth,objtimer,i 0 var ...

工資系統兩種方法

通用的系統 特點 一 乙個專案是另外乙個專案的子集 二 乙個專案可以任意於進行多項進行運算。三 乙個專案根據條件限制不同而結果不同。工資系統實現的使用者操作介面設想 文字描述 對於工資中的各個元素,可以任意做不同的操作組合。設計 在工資表裡的專案,找基礎資料 直接需要錄入的資料 列在工資表裡。有子集...