Escrito por Caique Paiva
Conhecimentos Prévios Necessários:
- DP em Árvore
- Decomposição em Raiz
Esse problema tem muitas soluções. A mais rápida que eu conheço é em , mas ela é bem complicada. Vou apresentar uma mais simples, que é em , e como o tl do problema é de 7 segundos, com uma implementação boa, ela passa.
- Como resolver com fixo?
Vamos calcular isso com uma dp! Seja um par de números: { A quantidade de caminhos de tamanho na subárvore de , O tamanho do maior caminho que começa por e passa somente por vértices que não foram escolhidos em um caminho ainda }. Feito isso, como vai ser a transição?
Seja um filho de . Temos que
Pois todo caminho de tamanho escolhido na subárvore de também pertence a subárvore de .
Agora, para , temos duas possibilidades.
- Seja dois filhos tal que é máximo e é o segundo maior. Temos que, caso , então, faça , pois caso isso seja verdade, podemos criar outro caminho de tamanho , e então, faça .
- Caso isso não aconteça, faça , pois esse é o maior caminho que podemos criar.
No final, basta retornar , e isso vai ser nossa resposta!
Conseguimos resolver o fixo em !! Só temos um problema, se rodarmos esse código para cada , temos um código , que não passa :(, como podemos otimizar? Seja a resposta para um certo .
- Lema:
Isso é verdade pois cada vértice pertence a no máximo 1 caminho e cada caminho tem vértices, então, se tivermos mais que caminhos, vamos ter que ter usado mais que vértices, o que é um absurdo. Esse lema acaba o problema! Pois isso implica que vamos ter no máximo valores distintos de ! Pois, caso , então , ou seja, de , temos no máximo valores, e entre , obviamente temos valores no máximo. Agora, veja que , portanto, a ideia vai ser o seguinte algoritmo, começando com :
- Primeiro, calculamos , e agora, vamos fazer uma busca binaria para achar o último tal que , então, vamos ter que . Então, em , conseguimos achar esse , e fazemos .
Agora, como temos no máximo valores diferentes, esse algoritmo só vai ser aplicado vezes, então, a complexidade no final fica .