Пожалуйста, подпишитесь на официальный канал Codeforces в Telegram по ссылке https://t.me/codeforces_official. ×

Блог пользователя elementaryGuy

Автор elementaryGuy, история, 3 года назад, По-английски

Hello CodeForces! I Need help with SUBTRCOV problem.

My thought process until now :

- The optimal set always consists of 1-degree nodes

  - Initially we start with a single 1-degree node as the subtree cover

  - Now in each step, if the subtree formed by the current subtree cover has less than k nodes, then we select farthest node from the current subree and add it to the cover.

However I can't think of efficient way of finding the farthest node (my approach involves using dfs everytime to find the farthest node which is O(n)) and hence my solution is O(n^2). Any help will be much appreciated. Thanks in advance.

  • Проголосовать: нравится
  • 0
  • Проголосовать: не нравится

»
3 года назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Hint — The end nodes of the diameter will always be present in the optimal answer. After that select leaves greedily.

»
3 года назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

My approach was to DFS to find a diameter node (this is always a node of greatest depth, irrespective of where you start), and then find the opposite diameter node (node of greatest depth from the other diameter node). This gives you the longest possible path such that you need just 2 nodes. From there your idea is correct, so it's just a question of how to implement. My implementation was to use a priority queue of leaf nodes, and a sparse table to check the lowest ancestor of each node already used, so I could update the depths and reinsert them into the PQ if necessary.

This is just one idea. There may well be more efficient solutions, but this was enough to pass.

My submission is here.