M jest skojarzeniem w G, gdy żadna krawędź z M nie ma wspólnego wierzchołka z żadną inną krawędzią.
M jest największym skojarzeniem, jeśli nie ma ścieżki powiększającej
Dowód : MD2
Hopcroft Karp
function HopcroftKarp(G: graf dwudzielny){
M = {}
while istnieje ścieżka powiększająca{
P <- zbiór najkrótszych wierzchołkowo rozłącznych ścieżek powiększających dla M
M = M xor P;
}
return M;
}Lemat
Jeśli P to zbiór najkrótszych wierzchołkowo rozłącznych ścieżek powiększających względem M, to długość najkrótszej ścieżki powiększającej względem M xor P jest większa.
d = długość ścieżek z P
= długość najkrótszej ścieżki z M xor P
Stan krawędzi zmienia się tylko, jeśli należy ona do P, jeśli nie, to zostaje w M nienaruszona. Jeśli pi nie przecina żadnej ze ścieżek z P, to oznacza, że wszystkie krawędzie są nieruszone przez P, co oznacza że pi byłaby ścieżką powiększającą dla M. Musi więc się przecinać z P.
Nie wprost zakładamy, że jest <= d; Udowodniliśmy, że musi się przecinać ze ścieżkami z P.
Niech przecina się po kolei ze ścieżkami . Każde rozcinasz w punkcie przecięcia na dwie połówki. sklejasz tak:
- - początek od startu do x_1, + reszta P_i
- - początek (lewa część) do , potem kawałek od do + reszta
- - początek + reszta .

Każda ścieżka jest powiększająca względem M, ponieważ:
- dwa końce wolne, co zawsze spełnione z definicji oraz
- różnica symetryczna dwóch skojarzeń. .
Jest to poprawne skojarzenie, bo jest powiększające względem M xor P. Wtedy:
M xor M” = M xor (M xor P xor ) = P xor .
Zbiór elementów w ścieżkach R to różnica symetryczna dwóch skojarzeń.
Jako że długość musi być >= d z założenia. (l+1) * d < e() + dl
więc > d, co kończy dowód.
Lemat
Jeśli w grafie G najkrótsza ścieżka powiększająca względem skojarzenia M ma d krawędzi, wówczas najliczniejsze skojarzenie w G ma rozmiar co najwyżej |M| + n/d.
Jeśli M* to najliczniejsze skojarzenie G, to M xor M* zawiera nie więcej niż n/d+1 ścieżek powiększających.
M* - M to liczba ścieżek powiększających M względem M xor M* (bo M xor M* to albo cykle, albo sciezki, na cyklach jest tyle samo w M i M*, na sciezkach parzystych tyle samo co M i M*, na nieparzystych jest jedna krawedz wiecej, z maksymalnosci M* sa tylko takie co M* ma wiecej).
Każda z tych ścieżek ma długość >= d, oraz k to ilość takich ścieżek to
Po pierwszych iteracjach najkrótsza ścieżka powiększająca ma długość przynajmniej . Kolejnych iteracji jest nie więcej niż , bo każda iteracja powiększa skojarzenie o conajmniej 1.
Maksymalny zbiór najkrótszych ścieżek powiększających znajdujemy w czasie O(m) (BFS z grafem warstwowym). O()
Najliczniejsze skojarzenie - Edmonds
function Edmonds(G: graf dwudzielny){
M = { }
while istnieje ścieżka powiększająca
Znajdź P;
M = M xor P;
zwróć M
}Kielich - cykl C o długości 2k+1 z k krawędziami skojarzenia taki, że istnieje parzysta ścieżka naprzemienna z wierzchołka C do wolnego wierzchołka.
Wykonaj BFS od wolnego wierzchołka, przechodząc po krawędziach szukając ścieżek naprzemiennych. Jeśli stworzyłeś kielich, ściągnij go do pojedynczego wierzchołka i kontynuuj przeszukiwanie. Jeśli dotrzesz do innego wolnego wierzchołka, cofnij ściągnięcia kielichów wzdłuż ścieżki i odtwórz ścieżkę powiększającą (?????).