Sunteți pe pagina 1din 4

Cuplaj maxim in graf bipartit.

Flux maxim
Nechita Vlad-Mihai
28 Ianuarie 2023

1 Cuplaj maxim in graf bipartit


1.1 Definirea problemei
Fiind dat un graf neorientat G = (V, E), un cuplaj este o submulţime de muchii
M ⊆ E astfel ı̂ncât pentru toate vârfurile v ∈ V , există cel mult o muchie ı̂n M
incidentă ı̂n v. Spunem că un vârf v ∈ V este cuplat de cuplajul M dacă există
o muchie ı̂n M incidentă ı̂n v; altfel, spunem că v este neconectat. Un cuplaj
maxim este un cuplaj de cardinalitate maximă, adică, un cuplaj M astfel ı̂ncât
pentru orice alt cuplaj M0 , avem |M | ≥ |M 0|.

1.2 Idee de rezolvare


Pornim de la un cuplaj ce nu contine nicio muchie. La fiecare pas incercam sa
gasim un drum de crestere. Daca am gasit, atunci extindem cuplajul cu ajutorul
acestuia.
Un drum de crestere reprezinta un drum intre 2 noduri necuplate ce este
constituit din muchii alternante(o muchie necuplata, o muchie cuplata, etc..)
Un cuplaj nu mai permite niciun drum de crestere ⇔ Este un cuplaj de
cardinal maxim.

1.3 Algoritmul lui Kuhn


Complexitate: O(n ∗ m)

i n t main ( )
{
// C i t i r e a d a t e l o r de i n t r a r e
for x in L
{
f o r ( i = 1 ; i <= | L | ; i ++) v i z [ i ] = 0 ;
dfs (x ) ;
}
}

1
b o o l d f s ( nod )
{
v i z [ nod ] = 1 ;
f o r x i n N nod
i f ( p [ x ] == −1 | | ( v i z [ p [ x ] ] == 0 && d f s ( p [ x ] ) == 1 ) )
{
p [ x ] = nod ;
return true ;
}
return f a l s e ;
}
https://infoarena.ro/job_detail/2971805?action=view-source

O euristica de optimizare: Random shuffle la muchii si adaugara a cat mai


multe muchii in cuplajul initial.

1.4 Algoritmi mai eficienti



Complexitate: O( n ∗ m)

1.4.1 Metoda bazata pe imbunatatirea algoritmului lui Kuhn


https://infoarena.ro/job_detail/2971806?action=view-source

1.4.2 Metoda bazata pe algoritmul lui Dinic (Algoritmul lui Hopcroft-


Karp)
• Se adauga 2 noduri, un nod sursa si un nod destinatie.
• Se traseaza muchii de capacitate 1 orientate de la sursa la fiecare nod din
prima multime.
• Se orienteaza toate muchiile de la prima multime catre a doua multime,
fiecare avand capacitatea 1.
• Se traseasa muchii de capacitate 1 orientate dinspre toate nodurile din a
doua multime catre sursa.
• Se rezolva problema fluxului maxim folosind algoritmul lui Dinic(Vezi 2.3),
care pe acest caz particular are o complexitate mai buna.

2 Flux maxim
2.1 Algoritmul lui Ford-Fulkerson
F - Fluxul maxim, C - Capacitatea maxima a unei muchii
m - Nr. de muchii, n - Nr. de noduri

2
Exemplu de cod:
https://infoarena.ro/job_detail/2971795?action=view-source
Complexitate: O(F ∗ m)

Dupa aplicarea euristicii capacity-scaling, cod:


https://infoarena.ro/job_detail/2971796?action=view-source
Complexitate: O(log(C) ∗ m ∗ m)

2.2 Algoritmul lui Edmonds-Karp


https://infoarena.ro/job_detail/2971798?action=view-source
Complexitate: O(m ∗ m ∗ n)

Dupa aplicarea euristicii capacity-scaling:


https://infoarena.ro/job_detail/2971799?action=view-source
Complexitate: O(log(C) ∗ m ∗ n)
Atentie: In practica constanta este foarte mare!

2.3 Algoritmul lui Dinic


https://infoarena.ro/job_detail/2971800?action=view-source
Complexitate: O(m ∗ n ∗ n)

Dupa aplicarea euristicii capacity-scaling:


https://infoarena.ro/job_detail/2971801?action=view-source
Complexitate: O(log(C) ∗ m ∗ n)

2.4 Alti algoritmi


Algoritmul lui Dinic optimizat cu Link-Cut-Tree: O(n ∗ m ∗ log(n))
Diferiti algoritmi bazati pe conceptul de preflux.
Cel mai bun algoritm cunoscut: O(n ∗ m)

3 Linkuri utile
https://cp-algorithms.com/graph/kuhn_maximum_bipartite_matching.html
https://cp-algorithms.com/graph/edmonds_karp.html
https://cp-algorithms.com/graph/dinic.html
https://www.youtube.com/playlist?list=PLrS21S1jm43igE57Ye_edwds_iL7ZOAG4
https://www.youtube.com/playlist?list=PLDV1Zeh2NRsDj3NzHbbFIC58etjZhiGcG

3
4 Probleme de facut in clasa
https://infoarena.ro/problema/cuplaj
https://infoarena.ro/problema/maxflow
https://www.pbinfo.ro/probleme/4014/rearanjaresir
https://atcoder.jp/contests/abc091/tasks/arc092_a?lang=en

5 Probleme pentru acasa


https://www.pbinfo.ro/probleme/4013/cmgb
https://codeforces.com/problemset/problem/1765/A
https://codeforces.com/contest/1082/problem/G
https://codeforces.com/contest/498/problem/c
https://codeforces.com/contest/1288/problem/f
https://codeforces.com/contest/808/problem/F
https://vjudge.net/contest/486189#problem/B

6 Contesturile de anul trecut


https://vjudge.net/contest/540376
https://vjudge.net/contest/540378

S-ar putea să vă placă și