Вот решение в O (n ^ 3), использующее минимальный поток затрат .
Вспомните, как мы создаем сеть для стандартного двустороннего сопоставления.
- Для каждой вершины u от L , добавить ребро единичной емкости от S до u ;
- Для каждого ребра uv , где u от L и v от R , добавьте край от u до v . Обратите внимание, что его емкость не имеет значения, если она хотя бы одна;
- Для каждой вершины v от R , добавьте ребро единичной емкости от u до R .
Теперь мы сохраним центральную часть и изменим левую и правую части.
- Для каждой вершины u от L , добавьте два ребра единичной емкости от S до u один из них стоил -1, а другой стоил 0;
То же самое для ребер v-> S .
Игнорирование стоимости, это та же сеть, которую вы построили сами. Максимальный поток здесь соответствует максимальному двойному совпадению.
Теперь давайте найдем минимальный поток затрат размером k . Это соответствует некоторому двойному сопоставлению, и из этого оно соответствует сопоставлению, которое касается максимально возможного числа вершин, потому что прикосновение к вершине (то есть проталкивание по крайней мере единичного потока через нее) уменьшает стоимость на 1. Более того, прикосновение к вершина во второй раз не уменьшает стоимость, потому что второе ребро стоило 0.
Как у нас есть решение: для каждого k = 1, ..., 2n итеративно найдите поток минимальных затрат и возьмите значение, соответствующее минимальной стоимости.
Использование алгоритма Джонсона (также называемого алгоритмом Дейкстры с потенциалами) дает O (n ^ 2) за итерацию, что в целом равно O (n ^ 3).
P.S. Время выполнения алгоритма Диника на единичных графах лучше, достигая O (E sqrt (V)) на двудольных графах.