Tarjan算法(LCA)

来源:互联网 发布:沙盘是什么软件 编辑:程序博客网 时间:2024/05/13 06:51

Tarjan算法是解决离线LCA(即最近公共祖先)的高效方法。

【算法分析】

首先,Tarjan算法是基于DFS的搜索框架。对于当前节点u:

1,先建立一个由这个点构成的集合,然后对于u的每个孩子v:

        对以v为根节点的子树进行搜索(即Tarjan(v))。搜索完后,这棵子树内的LCA询问都已经解决。然后,把当前子树所生成的集合与u合并。

2,把这个点记为已访问过。因为之前子树里的LCA已经解决,并且这个LCA一定不是u,所以,对于以u为根节点的子树里没有被计算过的LCA,其最近公共祖先就是v的当前祖先。

【时间复杂度】

这样做,DFS的时间为O(n),处理LCA为O(m)。所以,时间复杂度为O(n+m)。


扩展:求a,b的距离。

对于每次询问,其结果是dis(a) + dis(b) - 2 * dis(LCA(a,b))(其中dis(x)为x到root的距离)。因为:


图中,根节点到LCA(a,b)被dis(a)和dis(b)计算多了两次,所以要减回来。

经典例题:

HDU2586


0 0
原创粉丝点击