LCA tarjan演算法 模版

2021-07-04 05:09:45 字數 724 閱讀 1167

lca演算法:

lca(least common ancestor),顧名思義,是指在一棵樹中,距離兩個點最近的兩者的公共節點。也就是說,在兩個點通往根的道路上,肯定會有公共的節點,我們就是要求找到公共的節點中,深度盡量深的點。還可以表示成另一種說法,就是如果把樹看成是乙個圖,這找到這兩個點中的最短距離。

tarjan演算法是離線演算法,複雜度為o(n+q),使用了並查集+dfs的操作。中間的那個並查集操作的作用,只是將已經查詢過的節點捆成乙個集合然後再指向乙個公共的祖先。另外,如果要查詢lca(a,b),必須把(a,b)和(b,a)都加入鄰接表。

如poj1330為例

#include #include #include #include using namespace std;

#define maxn 10001

int n,fa[maxn];

int rank[maxn];

int indegree[maxn];

int vis[maxn];

vectorhash[maxn],qes[maxn];

int ances[maxn];//祖先

void init(int n)

}int find(int x)

void unio(int x,int y)

{ int fx=find(x),fy=find(y);

if(fx==fy) return ;

if(rank[fy]

複習LCA Tarjan演算法

解題報告 輸入描述的很恐怖,其實用scanf getchar也可以很簡單就寫出來,用tarjan演算法要注意,統計祖先的時候要想清楚,不要重複統計和少統計了。比如 2 解題報告 這個題構樹要用雙向邊,然後dfs時做訪問標記,根節點可以任意選擇乙個,雖然不同的根節點會導致同一對點的祖先不同,但是它們之...

演算法 LCA tarjan 倍增

呃,這個常用但是我一直不會 tar jan tarjan ta rjan tarjan 演算法基於 dfs 在 dfs 的過程中,對於每個節點位置的詢問做出相應的回答。tarjian,邊建邊 邊回答問題 include include include using namespace std intn...

LCA Tarjan演算法理解

scturtleposted 2011年10月08日 11 08 in algorithm 2734 閱讀 tarjan演算法的步驟是 當dfs到節點u時 1 在並查集中建立僅有u的集合,設定該集合的祖先為u 1 對u的每個孩子v 1.1 tarjan之 1.2 合併v到父節點u的集合,確保集合的祖...