Алгоритм Гопкрофта — Карпа

В інформатиці, алгоритм Гопкрофта—Карпа отримує на вході дводольний граф і видає на виході парування найбільшої потужності – множину, що містить якнайбільше ребер з властивістю, що жодна двійка ребер не має спільної вершини. Виконується за час у найгіршому випадку, де це множина ребер і це множина вершин графу. У випадку насиченого графу часові рамки набувають вигляду , для випадкових графів час виконання майже лінійний.

Алгоритм винайшли Джон Гопкрофт and Річард Карп (1973). Як і в попередніх методах для парування як-от Угорський алгоритм і роботі Едмондс, (1965), алгоритм Гопкрофта—Карпа багаторазово збільшує часткове парування через знаходження шляху розширення. Однак, замість пошуку одного шляху розширення, алгоритм шукає найбільшу множину найкоротших шляхів розширення. У результаті, потрібно лише ітерацій. Цей принцип використовували для розробки складніших алгоритмів для недводольного парування з таким самим часом виконання як у алгоритму Гопкрофта—Карпа.

Шляхи розширення

Збільшення парування через знаходження шляху розширення і застосування симетричної різниці для двох множин

У висліді маємо нове парування потужність якого на одиницю більша. Вершина, яка не є кінцем жодного ребра в певному частковому паруванні називається вільна вершина. В основі алгоритму лежить поняття шлях розширення, шлях який починається у вільній вершині і закінчується вільною вершиною, також він чергує ребро з парування з ребрами, що не входять до парування. Якщо це парування і це шлях розширення щодо , тоді симетрична різниця двох множин ребер, , буде парування розміру . Отже, знаходженням шляхів доповнення, алгоритм може збільшувати розмір парування.

І навпаки, припустимо, що не оптимальне, і нехай буде симетричною різницею де це оптимальне парування. Тоді, повинен утворювати набір неперетинних шляхів розширення і циклів або шляхів в яких вільні ребра і ребра з парування зустрічаються в однаковій кількості; різниця в розмірі між і це кількість шляхів розширення в Таким чином, якщо ми не можемо знайти шлях розширення, алгоритм може безпечно зупинитись, тому що в цьому випадку мусить бути оптимальним. Для докладнішого доведення дивись лему Берже.

Шлях розширення в задачі парування тісно пов'язаний із шляхом розширення в задачі про максимальний потік, тобто шляхом уздовж якого можна збільшити обсяг потоку між джерелом і стоком. Можливо перевести задачу парування дводольного графу в задачу знаходження максимального потоку таким чином, що переміжні шляхи задачі парування стануть шляхами розширення задачі про максимальний потік.[1] Насправді, узагальнення техніки використовуваної в алгоритмі Гопкрофта—Карпа для довільної потокової мережі відоме як алгоритм Дініца.

Вхід: Дводольний граф
Вихід: Парування
повторювати
найбільша множина вершинно-неперетинних найкоротших шляхів розширення
поки

Звичайний алгоритм

Нехай і будуть двома множинами у двоподілі де і нехай парування з у в будь-який час представлене як множина . Визначимо орієнтований граф як

ЗНАЙТИ-ШЛЯХ-РОЗШИРЕННЯ

  • множина вільних вершин у
  • множина вільних вершин у
  • побудувати орієнтований граф
  • знайти простий шлях з до у
  • якщо не існує тоді
    повернути (немає шляхів розширення)
  • інакше
    повернути ( це шлях розширення в )

Лема: Алгоритм ЗНАЙТИ-ШЛЯХ-РОЗШИРЕННЯ знаходить шлях тоді і тільки тоді, коли в існує шлях розширення щодо Більше того, і є шляхом розширення.

НАЙБІЛЬШЕ-ПАРУВАННЯ

  • повторювати
    ЗНАЙТИ-ШЛЯХ-РОЗШИРЕННЯ
    якщо тоді
    поки
    повернути

Розмір найбільшого парування має верхню границю і на кожному кроці збільшується на 1, отже цикл виконається не більше раз. Також нам потрібно часу, щоб знайти шлях розширення, отже алгоритм потребує часу.

Власне алгоритм Гопкрофта—Карпа

Задля гарантування, що довжина шляху розширення зростає від фази до фази, ми, в кожній фазі, будемо будувати найбільшу можливу множину шляхів розширення

Введемо позначення

Лема: Нехай буде довжиною найкоротшого шляху розширення щодо і нехай буде найбільшою множиною найкоротших неперетинних шляхів щодо тоді довжина найкоротшого шляху розширення щодо більша ніж

Наведемо процедуру, що будує множину Процедура базується на пошуку в глибину.

ЧАСТКОВИЙ-DFS
  • запустити допоки не знайдена перша вершина з
  • видалити усі вершини відвідані під час з графу
  • якщо існує шлях з до тоді
    повернути
  • інакше
    повернути

Видалення вершин гарантує неперетинність зі шляхами, що ми знайдемо пізніше.

Ми використовуватимемо цю процедуру для багатошарового графу який ми будуємо з Нехай буде множиною вільних вершин з Нехай буде відстань вершини від вершин з Граф містить такі ребра:

Лема: Кожен шлях у що починається в це найкоротший шлях в

МАКСИМАЛЬНА-МНОЖИНА-ШЛЯХІВ
  • побудувати граф
  • нехай буде множиною вільних вершин у
  • для виконати
    ЧАСТКОВИЙ-DFS
    якщо тоді
  • повернути

Лема: Процедура МАКСИМАЛЬНА-МНОЖИНА-ШЛЯХІВ знаходить найбільшу множину найкоротших вершинно-неперетинних шляхів розширення щодо за час

Алгоритм-Гопкрофта-Карпа
  • повторювати
    МАКСИМАЛЬНА-МНОЖИНА-ШЛЯХІВ
    якщо тоді
    поки
  • повернути

Аналіз

Алгоритм знаходить найбільше парування в дводольному графі за час

Лема: Нехай буде найбільшим паруванням, і нехай буде будь-яким паруванням на Якщо довжина найкоротшого шляху розширення щодо дорівнює тоді

Примітки

  1. Ahuja, Magnanti та Orlin, (1993), секція 12.3, задача потужності дводольного парування, сторінки 469–470.

Посилання

This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.