此题可以用lca_tarjan的方法来解决。
此题题意是,给定一棵树,每条边都有一定的权值,q次询问,每次询问某两点间的距离。这样就可以用LCA来解,首先找到u, v 两点的lca,然后计算一下距离值就可以了。这里的计算方法是,记下根结点到任意一点的距离dis [ x ] ,这样ans = dis[u] + dis[v] - 2 * dis[lca(v, v)]了,
那么为什么会呢
0
|
1
/ \
2 3
请看2,3的距离是2-->1-->3那么如果dis都表示个点到0点的距离,那么2,0的距离是2-->1-->0 那么3,0的距离是3-->1-->0由于0,1距离重复算了两遍
那么:ans = dis[u] + dis[v] - 2 * dis[lca(v, v)]
由于tarjan是需要离线算的,所以需要先把询问存下来并且编号,那么输出的时候才能保证与输入的编号一致。
此题数据比较水,我开始写错下标都可以ac。后来做模板在看的时候就看出错误了。
下面blog详细分析了tarjan代码,但是我的写法是在最后才套用ans的那个公式。我只记录到dis。那么就不用判断博客所说的建了重边判断的问题。但是这样可能需要多开1维数组来存
http://blog.youkuaiyun.com/taotaotaotao910429/article/details/7747346