Алгоритм Форда-Фалкерсона для поиска максимального паросочетания — различия между версиями
 (→Литература)  | 
				|||
| Строка 40: | Строка 40: | ||
           '''if''' dfs(x)  |            '''if''' dfs(x)  | ||
               changed = true  |                changed = true  | ||
| − | |||
| − | |||
| − | |||
[[Категория:Алгоритмы и структуры данных]]  | [[Категория:Алгоритмы и структуры данных]]  | ||
[[Категория:Задача о паросочетании]]  | [[Категория:Задача о паросочетании]]  | ||
Версия 08:39, 14 октября 2011
Алгоритм
Пусть дан двудольный граф и требуется найти максимальное паросочетание в нём. Преобразуем его в граф следующим образом:
Обозначим доли исходного графа как и . Тогда
- Будем искать путь из в поиском в глубину.
 - Если путь найден, инвертируем все рёбра на пути.
 - Если путь не был найден, значит текущее паросочетание является максимальным, и алгоритм завершает работу. Иначе переходим к пункту 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