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的集合,確保集合的祖...