寻找最近公共祖先

来源:互联网 发布:php get获取json数据 编辑:程序博客网 时间:2024/05/01 11:22

http://www.cppblog.com/myjfm/archive/2011/05/12/146282.aspx


http://blog.csdn.net/cxllyg/article/details/7635992


1、看递归就知道其实还是深度遍历这棵树;
2、首先使当前节点u的父指针指向自己;
3、处理u的所有孩子节点,每处理完一个孩子节点就让孩子节点的父指针指向u,即将孩子节点所在的集合与u的集合合并;
4、u的全部孩子处理完毕则将u标记为处理结束,即checked[u] = 1;
5、处理所有和u相关的询问,比如query[u][i] = v,则如果v已经被处理结束,则u和v必然处在一棵并查集树上,并且这棵树的根节点一定是他们的公共祖先
(为什么?画图找实例然后手动运行一遍不难理解,因为每个节点(比如为x)运行完之后就将x的父指针指向它的父亲(这时父亲节点的父指针依然指向自己),然后再去运行x的兄弟节点,这时兄弟节点下的某个节点(比如y)如果在查询中,且查询如果恰好是(y, x的子孙),则x所在并查集树中的根节点一定是x的父节点,而这个父节点也是y的祖先,因此可知(y, x的子孙)的祖先一定包含x的父节点,由上面过程知道不能可包含比x的父节点更低的祖先节点,因此x的祖先节点必然是(y, x的子孙)的最近公共祖先);这样说必然很难理解,不过找个真正的实例运行一遍就一目了然了~

0 0
原创粉丝点击