如何在深圳找到性价比高的网站建设公司?

摘要:深圳网站建设首选全通网络,北京网站开发报价,做网站路由器映射外网,中国最大免费h5游戏源码网站题目链接 一:我们考虑树上两点之间的路径有什么情况 1:经过根节点&#
深圳网站建设首选全通网络,北京网站开发报价,做网站路由器映射外网,中国最大免费h5游戏源码网站题目链接 一#xff1a;我们考虑树上两点之间的路径有什么情况 1#xff1a;经过根节点#xff08;即在根节点的两端#xff09; 2#xff1a;不经过根节点#xff08;完全在一颗子树的一侧#xff09; 二#xff1a;我们考虑这两种路径是否可以归为一类 1#xff1…题目链接 一我们考虑树上两点之间的路径有什么情况 1经过根节点即在根节点的两端 2不经过根节点完全在一颗子树的一侧 二我们考虑这两种路径是否可以归为一类 1对于第一种的情况两点间路径长度dis( u , v ) 可以看为dis ( u , root ) dis ( root , v )  2而对于第二种情况我们可以找到u , v 路径所在的子树将根节点变为子树的根节点然后就变为了第一种情况 3总之所以我们可以不断的递归根节点将所有情况转化为第一种情况 设b[ u ] 表示u属于哪一棵子树(b数组在算法进阶指南里说了但是代码好像没有体现而是用了容斥原理 那么b[ u ] b[ v ] d[ u ] d[ v ] ≤ k满足条件的第一类路径条数即为满足条件的点对数 三下面我们来讨论如何计算满足条件的点对数 1将目前子树中的节点到根节点的权值放入数组len中并排序 用两个指针 L,R 扫描数组每找到一个合法的答案就加上R −L 就让L否则让 R -- 2发现问题 在指针扫描的过程中我们会出现不合的情况 根据len的定义我们存放的一颗树里面所有的边这是我们计算calc计算时可能会加上两条边在子树的同一侧的情况我们可以发现不合法的路径在当前根的一颗子树上即没有跨越两棵子树如果跨越了它就合法了所以们可以在遍历的时候减去不合法的情况容斥 3具体的方法 ans calc( u , 0 )  ans − calc ( v , dis ( u , v ) )  这样即可做到不重不漏 四总结 点分治步骤 找到树的重心将重心视为根节点那么树上任意两点有两种情况路径经过根节点路径不经过根节点通过 calc  函数计算出第一种情况下的答案把根节点从树中删去对每棵子树递归执行上面的操作 calc函数的计算方法 计算出每个结点到根节点的距离 d [ i ]将树上的结点按照 d [ i ] 递增排序指针 l  指向 d [ 1 ] 指针 r 指向 d [ n ]。若 l 与 r 指向结点的距离小于 k  ,则 ans r − l 1 , l 。否则 r − −。当 l r  的时候退出循环。按照上面的方法会把不经过根节点的路径也算入进去。
阅读全文