摘要: 题意:给定一棵树,然后给定若干组询问,问某些点被作为最近公共祖先的次数。解法:刚刚一直不知道根在哪里给了出来,后来才发现给定的点一定是按照从层数低的节点指向层数高的节点,因此没有双亲的节点为根节点,然后运行tarjan算法即可。这里刚开始的时候我还想把最后的结果除以2输出,这里没有这个必要,因为两个节点一定有一个先后的遍历顺序,这个顺序保证了只被统计一次。代码如下:#include <cstdlib>#include <cstdio>#include <cstring>#include <algorithm>#include <iostre 阅读全文
posted @ 2013-05-17 16:31 沐阳 阅读(268) 评论(0) 推荐(0) 编辑
摘要: 题意:给定N个节点一棵树,现在要求询问任意两点之间的简单路径的距离,其实也就是最短路径距离。解法:spfa:直接对每一对点作一次spfa即可。Tarjan:求出两个点A,B之间的最近公共祖先C,设根到每个点的最短距离为dis[],那么距离就是dis[A]+dis[B]-2*dis[C]。而根到各个点的距离一次dfs就出来了,因此问题转化为求出两点之间的最近公共祖先,Tarjan算法能够离线解决所询问的点对。原理如下:对于一次dfs,当第一次遍历到点u时,那么令set[u] = u。遍历完以u为根的树后,将u所属集合指向双亲节点。接下来查看u的访问列表中有没有询问<u, v>的点对, 阅读全文
posted @ 2013-05-17 15:34 沐阳 阅读(337) 评论(0) 推荐(0) 编辑