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

Матеріал з testwiki
Перейти до навігації Перейти до пошуку

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

Алгоритм винайшли Шаблон:Harvs. Як і в попередніх методах для парування як-от Угорський алгоритм і роботі Шаблон:Harvtxt, алгоритм Гопкрофта—Карпа багаторазово збільшує часткове парування через знаходження шляху розширення. Однак, замість пошуку одного шляху розширення, алгоритм шукає найбільшу множину найкоротших шляхів розширення. У результаті, потрібно лише O(n) ітерацій. Цей принцип використовували для розробки складніших алгоритмів для недвочасткового парування з таким самим часом виконання як у алгоритму Гопкрофта—Карпа.

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

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

У висліді маємо нове парування {a,c}, потужність якого на одиницю більша. Вершина, яка не є кінцем жодного ребра в певному частковому паруванні M називається вільна вершина. В основі алгоритму лежить поняття шлях розширення, шлях який починається у вільній вершині і закінчується вільною вершиною, також він чергує ребро з парування з ребрами, що не входять до парування. Якщо M це парування і P це шлях розширення щодо M, тоді симетрична різниця двох множин ребер, MP, буде парування розміру |M|+1. Отже, знаходженням шляхів доповнення, алгоритм може збільшувати розмір парування.

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

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

Вхід: Двочастковий граф G(LR,E)
Вихід: Парування ME
M
повторювати
𝒫{P1,P2,,Pk} найбільша множина вершинно-неперетинних найкоротших шляхів розширення
MM(P1P2Pk)
поки 𝒫=

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

Нехай V1 і V2 будуть двома множинами у двоподілі G=(V,E), де V=V1V2, і нехай парування з V1 у V2 в будь-який час представлене як множина M. Визначимо орієнтований граф GM=(V1V2,EM) як

EM={(v1,v2):v1v2E,v1V1,v2V2}{(v2,v1):v1v2M,v1V1,v2V2}.

ЗНАЙТИ-ШЛЯХ-РОЗШИРЕННЯ (G=(V1V2,E),M)

  • V1= множина вільних вершин у V1
  • V2= множина вільних вершин у V2
  • побудувати орієнтований граф GM=(V1V2,EM)
  • знайти простий шлях p з V1 до V2 у GM
  • якщо p не існує тоді
    повернути NIL (немає шляхів розширення)
  • інакше
    повернути p (p це шлях розширення в G)

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

НАЙБІЛЬШЕ-ПАРУВАННЯ G=(V1V2,E))

  • M=
  • повторювати
    p=ЗНАЙТИ-ШЛЯХ-РОЗШИРЕННЯ(G,M)
    якщо pNIL тоді
    M=Mp
    поки
    повернути M

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

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

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

Введемо позначення MP=M(pPp).

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

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

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

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

Ми використовуватимемо цю процедуру для багатошарового графа G¯M, який ми будуємо з GM. Нехай V1 буде множиною вільних вершин з V1. Нехай d:V буде відстань d(v) вершини v від вершин з V1. Граф G¯M=(V1V2,E¯V) містить такі ребра:

E¯M={(u,v):(u,v)EM|d(u)+1=d(v)}.

Лема: Кожен шлях у G¯M, що починається в V1 це найкоротший шлях в GM.

МАКСИМАЛЬНА-МНОЖИНА-ШЛЯХІВ(G=(V1V2,E),M)
  • P=
  • побудувати граф G¯M=(V1V2,E¯M)
  • нехай V1 буде множиною вільних вершин у V1
  • для vV1виконати
    p= ЧАСТКОВИЙ-DFS(G¯M,v,V2)
    якщо pNIL тоді
    P=Pp
  • повернути P

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

Алгоритм-Гопкрофта-Карпа(G=(V1V2,E))
  • M=
  • повторювати
    P= МАКСИМАЛЬНА-МНОЖИНА-ШЛЯХІВ(G=(V1,V2,E),M)
    якщо PNIL тоді
    M=MP
    поки P=NIL
  • повернути M

Аналіз

Алгоритм знаходить найбільше парування в двочастковому графі за час O(|V||E|).

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

Примітки

Шаблон:Reflist

Посилання

Шаблон:Алгоритми на графах

  1. Шаблон:Harvtxt, секція 12.3, задача потужності двочасткового парування, сторінки 469–470.