Начните с разделения графика на связанные компоненты, это можно сделать за время O (n) и в памяти, выполнив поиск по глубине или по ширине.
Если какие-либо узлы не подключены к другому узлутогда решение невозможно.
Начните с листьев каждого дерева DFS / BFS (т. е. узлов, подключенных только к одному другому узлу) и разбейте каждый подключенный компонент на пары (или триплеты) соседних узлов.Каждая пара (или триплет) должна входить в следующий сегмент с наименьшим числом узлов в нем.
o o
/ \ |
o o o o | | | | | |
| / \ / | | | | | | |
o o o o | | | | | |
\ \ / / |____| |____| |____|
--o---- Bucket 1 Bucket 2 Bucket 3
Удалить 2 узла из левого листа.
o o
/ \ |
a o o o |a | | | | |
| / \ / | || | | | | |
a o o o |a | | | | |
\ \ / / |____| |____| |____|
--o---- Bucket 1 Bucket 2 Bucket 3
Удалить 2 узлас правого листа.
o b
/ \ |
o o b |a | |b | | |
/ \ / | || | || | | |
o o o |a | |b | | |
\ / / |____| |____| |____|
o---- Bucket 1 Bucket 2 Bucket 3
Затем удалите последнюю вершину степени 1 и ее соседа:
o
/ \
o o |a | |b | |c |
/ \ / || | || | || |
o o c |a | |b | |c |
\ / / |____| |____| |____|
c---- Bucket 1 Bucket 2 Bucket 3
Это создаст новую вершину степени 1 в оставшемся подграфе, поэтому удалите ееи смежная с ним вершина:
o
/ \
d o |a d | |b | |c |
/ \ / || | | || | || |
d o |a d | |b | |c |
|____| |____| |____|
Bucket 1 Bucket 2 Bucket 3
Осталось только 3 вершины, если она уместится в ведро, затем поместите его в ведро - в противном случае переместите пару из ведра с наименьшим количеством элементов введро со следующим наименьшим количеством предметов и добавьте триплет на его место.
e
\
e |a d | |e e | |c b |
/ || | | |\ / | || | |
e |a d | | e | |c b |
|____| |____| |____|
Bucket 1 Bucket 2 Bucket 3
Единственная проблема будет, когда вы получите звездообразные подключенные компоненты
o o
\ /
o--o--o
/ \
o o
Тогда весьподключенный компонент должен войти в тот же сегмент, так как вы не можете разбить граф, удалив пару триплетов смежных вершин без оставшихся одиночных непересекающихся вершин.Это можно проверить, проверив, есть ли при удалении пары другие смежные вершины, имеющие степень один, и, если да, добавьте их в пару.