LCA
Copyright
本页面贡献者:zrz。 本页面内容遵循 MIT 协议,转载请附上原文出处链接和本声明。
关于离线和在线¶
- 离线算法其实就是将多个询问一次性解决。离线算法往往是与在线算法相对的。例如求LCA的算法中,树上倍增属于在线算法,在对树进行O(n)预处理后,每个询问用O(log_2n)复杂度回答。而离线的Tarjan算法则是用O(n+q)时间将询问一次性全部回答。
朴素算法¶
向上标记法
Tarjan¶
Tarjan的基本思想其实的就是想上标记法的优化,使用并查集优化,就是把回溯的点的合并到父节点,难点其实在于记录闻讯和dfs函数的结构 复杂度O(n+m)
problem
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
|
-
Tarjan(离线)算法
直接的模板
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
|
在线倍增lca¶
复杂度:初始化O(n)问讯O(logn)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
|