Topcoder SRM703 Div2 1000pts

题目大意

一棵 n 个点的无根树,求这棵树的一个联通子图,使得它的直径数目最多。输出这个最大值。

1 n 1000


树的直径有以下两条性质:

  • 从树上任意一个点 d f s ,所到达的所有最远的点都是直径的端点;

  • 树的所有直径必交于某一点或某条边。

为什么所有直径必有公共部分?下面是证明:

  • 若两条直径没有交点,而在一棵树上任意两个点都是连通的,因此可以让这两条直径的端点连通,得到一条更长的直径;

  • 若三条直径有两个交点,如图:

    由于 a + g + d = b + g + d = c + g + d ,所以 a = b = c ,同理 d = e = f ,因此 b c e f 不是直径;

  • 多条直径跟三条直径一样证明。

因此可以 O ( n ) 枚举这个交点或边,每次 O ( n )   b f s ,统计在某一距离时,跨过这个点或边的路径数目,所有答案取 m a x

时间复杂度 O ( n 2 )

猜你喜欢

转载自blog.csdn.net/Milkyyyyy/article/details/81737718