最近公共祖先 LCA (Lowest Common Ancestor)

【題目描述】
在有根樹中,兩個節點 u 和 v 的公共祖先中距離最近的被稱爲最近公共祖先LCA。
給出一棵有根樹,有 M 對查詢,求每一對 u 和 v 的LCA。
【輸入格式】
第一行,N,表示這棵樹有 N 個節點。
第二行~第 N 行,x 和 y,表示 x 是 y 的祖先。
第 N+1 行,M。
第 N+2 行~第 N+M+1行,u 和 v。
【輸出格式】
對於每組 u 和 v,輸出它們的LCA。
每組對應的輸出單獨佔一行。

一、樸素算法

先讓 u 和 v 中深度較深的上升到與較淺的持平,在一起一步步向上走,走到同一個節點爲止。
所以該算法每次查詢的時間複雜度是 O(n)。

二、二分搜索

對於任意頂點 v,若 parent[0][v] 爲它的父親節點,則 parent[1][v]=parent[0][parent[0][v]] 就是 v 向上走兩步到的頂點,繼續推,可得 parent[2][v]=parent[1][parent[1][v]] 即爲 v 向上走四步到的頂點,以此類推,就能得到其向上走2^k步所到的頂點parent[k][v]。由此就能二分搜索了。
預處理 parent[k][v] 的時間複雜度爲 O(NlogN),每次查詢的複雜度是O(logN)。

三、RMQ

(略,有時間再補)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章