10课别饿坏了那匹马练习册最后一题怎么做
来源:学生作业帮助网 编辑:作业帮 时间:2024/11/25 14:38:07
10课别饿坏了那匹马练习册最后一题怎么做
10课别饿坏了那匹马练习册最后一题怎么做
10课别饿坏了那匹马练习册最后一题怎么做
[解题思想]
我的算法是严格立方的.中心理念是不要做重复的工作.算法比较笨拙.考虑到树的性质,对于任意两点,最短路=联通路=最长路.
首先求出多源最短路,该步可以用类似Tarjan的算法,在O(N^2)内解决.实际上由于下一步的复杂度高达三次方,这里就直接floyd了.同时可以求出最长路径上都有哪些点.在NOI2007中,记录最短路的中间结点是很有用的.设mid[a,b]是a,b之间的联通路上的一个中间点,.
由于这是一棵树,最短路必然唯一.考虑问题的解,构造一个函数F(k,a,b)为K到ab间的最短路的长度.则f(k,a,b)=min{d[k,mid [a,b],f[k,a,mid[a,b]],f[k,mid[a,b],b]} 写出了这个方程,便不难得出一个三次方的算法.
在实际coding的时候,把k放在最外层枚举,这样内层实际上只用到了f的后面2维,用2维数组记录即可.
[解题思想2,by peterche1990/2wsx2wsx2wsx/czp]
容易求出所有最长路,以及所有最长路上的点.依次枚举,复杂度是O(KN^3),其中K是最长路的条数.该算法易于实现,但是写得不好会TLE1个点,部分大牛就是这样没有得400的.
[解题思想3]
引理:如果树有多条直径,则每条直径上都存在一个core.
证明:首先,如图,如果ABCD和FBCE都是直径的话,则AB=FB,CD=CE(如果不然,可设AB>FB,则FBCEAG,ecc=max{BF,ID}.也就是说,如果路径和公共段有交集,实际计算max时,只需要计算路径在公共段上的部分的ecc,然后和公共段两端的路径长取一遍MAX就行了.
下面证明,使得ecc取到最小的core必然和公共段有交集.设没有交集,则必然有一条直径和这个core没有交集,此core的ecc就至少严格大于公共段长度+除去公共段的半条路径长度,然而,公共段上的点到其他点的最长距离,最大不会大于这个长度,这与ecc最小矛盾!
通过上面的论述,得出core只与公共段有关,也就是说引理成立.所以在计算时任选一条直径即可,因为任意一条路径都覆盖了公共段.
到了这里,写出O(N^2)的算法应该不难了.
通过一次DFS,可以求出所有点之间的连通路.此算法类似LCA,复杂度为O(N^2*A),其中A=ECC(B),所以尽量沿直径伸展core即可,直到不能向前伸展(长度超过了s).这类似于凸包求最远点对.
实现时维护首尾指针统计即可.这样的实现是O(n)的.
我可以明确地告诉你:不不不知知知道道道!!!
咳咳咳!你自己想!如果你总是依赖与别人,难道开始的时候还要带电脑去么
我也不知道 好难的(+﹏+)~狂晕 ( ⊙ _ ⊙ )一般吧
2
3333333333333222222222222222222222222222222222222222222222132111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111...
全部展开
我也不知道 好难的(+﹏+)~狂晕 ( ⊙ _ ⊙ )一般吧
2
3333333333333222222222222222222222222222222222222222222222132111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
收起