Editorial for COCI '08 Contest 1 #6 Krtica
Submitting an official solution before solving the problem yourself is a bannable offence.
Since the number of edges that a mole can remove is one, it is possible to iterate through all the edges to calculate which edge needs to be added if we remove that edge.
Suppose we remove edge and that doing so separates the tree into subtrees and . Now we need to create a new edge where vertex is in subtree and vertex is in subtree . There are many ways to do this to check them all.
Notice that the diameter of the new tree will be the largest of:
- The diameter of subtree , of length ;
- The diameter of subtree , of length ;
- The length of the longest path in subtree rooted in plus the length of the longest path in subtree rooted in plus one (for ).
The first two of these depend only on edge , the last on edge . For this path to be as short as possible, we choose to be the halfway point on the diameter of subtree and to be the halfway point on the diameter of subtree .
The length of the new path is then:
For each choice of edge , we can calculate the shortest diameter we can achieve if we remove that edge, and it is exactly:
So we need to calculate the diameters of both subtrees. The total number of subtrees we need to do this for is , so we cannot afford a linear search for every subtree.
If we root the tree in any vertex, then subtrees isolated by removing edges from the tree can be divided into two groups – those not containing the root (call these subtrees "hanging") and those containing the root (call these "trimmed").
We can use dynamic programming to calculate the diameters of hanging subtrees. Let and be the two longest paths from vertex to leafs in the tree. Then the diameter of the subtree rooted at is easily calculated as:
The diameters of trimmed trees can also be found using dynamic programming. This time the recursive relation is more complex and calculated in the opposite order – from root to leaves.
Once we have calculated the diameters we can easily find which edge to remove. After this, we can find the halfway points on the diameters of subtrees to find which edge to add.
The overall complexity of the solution is .
Comments