Fişierul intrare/ieşire:cuplaj1.in, cuplaj1.outSursă
AutorAutor necunoscutAdăugată defireatmyselfBogdan-Alexandru Stoica fireatmyself
Timp execuţie pe test0.25 secLimită de memorie20480 kbytes
Scorul tăuN/ADificultateN/A

Vezi solutiile trimise | Statistici

Cuplaj Maxim

Se numeste graf bipartit un graf G ale carui noduri pot fi partitionate in doua multimi disjuncte A si B astfel incat oricare muchie uneste un nod din A si un nod din B. Cu alte cuvinte, nu exista doua nuduri i si j din aceeasi multime astfel incat sa existe muchie intre ele.

Fie G un graf bipartit. Numim cuplaj o submultime de muchii M \subset E (unde E este multimea muchiilor grafului) cu proprietatea ca ∀ iA exista cel mult o muchie in M incidenta in i. Spunem ca i este cuplat de cuplajul M daca exista o muchie in M incidenta in i. In caz contrar spunem ca i este necuplat. Numim cuplaj maxim o multime M de cardinal maxim, adica nu exista nicio alta multime M' cu |M'| > |M| (unde cu |M| am notat cardinalul multimii M).

Cerinta

Se da un graf bipartit G. Se cere sa se gaseasca valoarea cuplajului maxim.

Date de intrare

Pe prima linie a fisierului de intrare cuplaj1.in se afla N1, N2 si M. N1 reprezinta numarul de noduri ale multimii A, iar N2 numarul de noduri ale multii B. Pe urmatoarele M linii se afla cate doua numere a si b cu semnificatia ca intre nodurile aA si bB exista muchie.

Date de iesire

In fisierul de iesire cuplaj1.out se va scrie un singur numar, valoarea cuplajului maxim.

Restrictii

  • 1 ≤ N1, N2 ≤ 2000
  • 1 ≤ M ≤ 310 000
  • nodurile multimii A sunt numerotate de la 1 la N1
  • nodurile multimii B sunt numerotate de la 1 la N2

Exemplu

cuplaj1.incuplaj1.out
5 4 6
1 1
2 1
1 4
3 2
5 4
4 2
3

Indicatii

O metoda de rezolvare foloseste algoritmii de flux maxim:
Se construieste un graf G' pornind de la graful G la care mai adaugam doua noduri: o sursa si o destinatie. Toate nodurile multimii A se leaga de sursa respectiva si toate nodurile multimii B se leaga de destinatia respectiva. Se considera ca muchiile grafului G' au capacitatea 1. Valoarea cuplajului maxim in graful G este numeric egala cu valoarea fluxlui maxim din graful G'.

O solutie mai rapida si mult mai usor de implementat este cea care se bazeaza pe lanturi augmentative:
Pentru orice i din A definim Ri ca fiind nodul de care este acesta cuplat in B. De asemenea, pentru orice nod i din B, definim Li ca fiind nodul de care este acesta cuplat in A. Initial, vectorii au valoarile 0.
Pentru fiecare nod necuplat din A apelam functia recursiva pairup care va functiona astfel:

  1. daca exista un vecin necuplat de-ai lui i, il vom cupla cu unul dintre ei;
  2. daca nu, incercam sa fortam cuplarea lui i (daca se poate) cu un vecin deja cuplat (fie el j); decuplandu-l pe j, va trebui sa recuplam nodul de care era anterior legat, deci vom apela recursiv functia pairup, de data aceasta pentru Lj.

La final, valoarea cuplajului maximal va fi egala cu numarul de noduri i cuplate, adica cele pentru care Ri > 0.

Pentru clarificarea algoritmului puteti consulata sursa.

Mai multe detalii despre cuplajul in graf bipartit, precum si probleme asemanatoare se pot gasi in acest aritcol.

Probleme asemanatoare:

Trebuie sa te autentifici pentru a trimite solutii. Click aici

Cum se trimit solutii?