Autor del problema: | Taras Derkach |
Preparado por: | Taras Derkach |
Editorial: | Taras Derkach |
Solución
Fijemos el vértice que elegimos como vértice central.
Después de esto, se eliminan todos los vértices que están a distancia exactamente de .
Veamos qué componentes conexas quedan.
La primera componente siempre contiene el propio vértice y todos sus vecinos. Denotemos su suma como center_v:
Las demás componentes solo pueden aparecer detrás de los vértices que fueron eliminados.
Sea un vecino del vértice , y sea un vecino del vértice , donde x \ne v.
Entonces el vértice está a distancia exactamente de , por lo que se elimina. Después de eliminar , pueden quedar componentes que están detrás de sus otros vecinos.
Es decir, necesitamos conocer rápidamente el siguiente valor:
si existe una arista , cuál es la suma de la componente que queda del lado del vértice si eliminamos esta arista.
Denotemos esta suma como side(x,y).
Si enraizamos el árbol en el vértice , entonces side(x,y) se puede calcular fácilmente usando sumas de subárboles:
si es hijo de , entonces side(x,y) = subtree_y;
en caso contrario, side(x,y) = total - subtree_x.
Para cada vértice , guardaremos los dos valores mínimos y los dos valores máximos entre todos los side(x,y) para todos los vecinos .
¿Por qué dos? Porque a veces necesitamos tomar el mejor valor, pero prohibir una dirección específica. Por ejemplo, cuando miramos un vértice eliminado , no podemos tomar la dirección de vuelta hacia , porque llegamos a desde allí.
Luego, para cada vértice , guardaremos las menores y mayores sumas de componentes que pueden aparecer después de eliminar uno de los vecinos del vértice .
En otras palabras, para cada vecino del vértice , tomamos la mejor componente detrás de , pero no en la dirección de vuelta hacia .
Después de esta preparación, la respuesta para un vértice central fijo se puede encontrar rápidamente.
Primero tenemos la componente con suma center_v.
Luego, para cada vecino del vértice , tomamos la menor y la mayor componente posible entre los vértices que están detrás de . Al mismo tiempo, debemos prohibir la dirección de vuelta hacia .
Entre todas las componentes encontradas, buscamos la suma mínima y la suma máxima. El contraste para el vértice es igual a:
La respuesta es el máximo de este valor entre todos los vértices .
Ejemplo
En el primer ejemplo, es óptimo elegir el vértice v = 4.
Entonces el vértice está a distancia exactamente de él, por lo que se elimina.
Después de la eliminación, quedan dos componentes conexas:
con suma ;
\{3,4,5\} con suma 3 + 4 + 5 = 12.
Por lo tanto, el contraste es igual a:
Complejidad
Calculamos las sumas de subárboles una sola vez, y después para cada vértice recorremos sus vecinos.
Cada arista se procesa solo un número constante de veces.
Por lo tanto, la complejidad de la solución es .