在並查集中建立僅有u的集合,設置該集合的祖先為u
對u的每個孩子v:
- 遞迴處理v
- 合併v的集合到父節點u的集合,確保集合的祖先是u
處理關於u的查詢,若查詢(u,x)中的x已遍歷過,則LCA(u,x) = x所在的集合的祖先
因為只進行過一次DFS,所以複雜度為\(\ord{(N+Q)*\alpha(N)}\),為了優化並查集,這裡採用啟發式合併,因此為了記錄集合的祖先而外增加了一個數組head
其雖為線性,但是效率並不怎麼好,跟倍增法的效能差不多
使用方法也很簡單,只需要將每個詢問的兩點記錄起來即可
沒有留言:
張貼留言