Один точный алгоритм таков:
Начните с листьев и создайте непересекающиеся графы (на самом деле все они - K1), на каждом шаге найдите родителя этих листьев и объедините их в новое дерево, в каждомшаг, если у узла x
есть r
известный дочерний элемент и степень узла j
такая, что j = r+1
, просто узел, который не находится в дочернем узле x
, является родителем текущего узла, в этом случае мы говорим, что узелx
равно nice
, в противном случае есть некоторые дочерние элементы, для которых связанное корневое поддерево их не построено, в этом случае мы говорим, что узел x
равен bad
.
Таким образом, на каждом шаге подключайтесьnice
узлов к их родителю, и очевидно, что каждый шаг занимает sum of {degree of parent nice nodes}
, также на каждом шаге у вас есть хотя бы один красивый узел (потому что вы начинаете с листа), поэтому алгоритм равен O (n), и он будетсделано полностью, но для нахождения узла, который должен быть удален. Фактически на каждом шаге требуется проверить размер непересекающегося списка (списков поддеревьев), это можно сделать в O (1) при построении, также если размер списка равенравно или бибольше чем n / 2, затем выберите связанный хороший узел.(на самом деле найдите симпатичный узел в минимальном списке, который удовлетворяет этому условию).
Очевидно, что если возможно правильно разделить дерево (каждая часть имеет не более n / 2 узла), вы можете сделать этопо этому алгоритму, но если это не так (на самом деле вы не можете разделить его на две или более части размера, меньшего, чем n / 2), это даст вам хорошее приближение для него.Также, как вы можете видеть, в дереве ввода нет допущений.
примечание: я не знаю, возможно ли иметь такое дерево, чтобы его нельзя было разбить на части размером меньше n / 2 с помощьюудаление одного узла.