hdu2586 lca_tarjan的应用

来源:互联网 发布:淘宝助理一键导出 编辑:程序博客网 时间:2024/05/16 12:16

此题可以用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.csdn.net/taotaotaotao910429/article/details/7747346

 

原创粉丝点击