Алгоритм Форда-Фалкерсона для поиска максимального паросочетания
Идея алгоритма
Пусть дан двудольный граф максимальное паросочетание в нём. Обозначим доли исходного графа как и . Построим граф следующим образом:
и требуется найти(т.е. добавим две новые вершины и )
(проведем ребра из в каждую вершину , и из каждой вершины в ).
Изначально максимальное паросочетание пусто.
- Будем искать в графе путь из в поиском в глубину.
- Если путь найден, инвертируем все рёбра на пути.
- Если путь не был найден, значит текущее паросочетание является максимальным, и алгоритм завершает работу. Иначе переходим к пункту 1.
В любой момент времени текущим паросочетанием будет множество рёбер, направленных из
в .Псевдокод
bool dfs(x)
if vis[x]
return false
vis[x] = true
for
if py[y] = -1
py[y] = x
px[x] = y
return true
else if dfs(py[y])
py[y] = x
px[x] = y
return true
return false
px[] = -1
py[] = -1
while (changed)
changed = false
vis[] = false
for
if (px[x] == -1)
if dfs(x)
changed = true