Diferente pentru flux-si-cuplaj intre reviziile #25 si #26

Nu exista diferente intre titluri.

Diferente intre continut:

Cuplajul maxim va fi chiar fluxul maxim în această reţea. Nu ne rămâne decât să rulăm unul din algoritmii cunoscuţi precum Edmonds-Karp, Dinic… Complexitatea obţinută va fi O(V *  E) deoarece orice cuplaj în graful bipartit are cardinalitate cel mult min(V1, V2).
Un algoritm performant pentru determinarea cuplajului maxim este Algoritmul Hopcroft-Karp. Acest algoritm în loc să determine un singur drum de ameliorare la fiecare pas, el determină un numar maximal (nu neapărat maxim) de drumuri distincte. Astfel se poate demonstra că numarul de paşi necesari este cel mult sqrt(V) . Prin urmare complexitatea va deveni O(E*sqrt(V)).
 
 
 
h2. Suport Minim
 
Într-un graf bipartit un suport minim reprezintă o mulţime de noduri cu cardinal minim pentru care orice muchie a grafului este adiacentă cu cel puţin unul dintre nodurile mulţimii. Conform Teoremei lui Koning într-un graf bipartit cuplajul maxim şi suportul minim sunt egale.
Pentru a calcula suportul minim vom porni de la un cuplaj maxim. Nodurile din prima mulţime care aparţin cuplajului vor fi incluse în suportul minim, iar pentru cele care nu aparţin cuplajului vom folosi o funcţie recursiva care în momentul în care gaseşte o muchie care nu are cel puţin un nod în suport, adauga nodul din V2 şi şterge nodul din stânga cu care este cuplat nodul respctiv şi apelează recursiv pentru nodul din stânga.
 
 
Funcţia recursiva arata astfel:
 
 
== code(c) |
inline void support(int n)
{
    vector<int>::iterator it;
 
    for(it=a[n].begin(); it!=a[n].end(); ++it)
    //pentru fiecare nod *it(din dreapta) adiacent lui n
	if(!sr[*it]) // daca nu e in suport
	{
	    sr[*it]=1;  // il adaug in suport
	    sl[l[*it]]=0;
    // sterg din suport nodul din stanga cu care este cuplat *it
	    support(l[*it]); // apelez recursiv pentru nodul din stanga
	}
}
 
==

Nu exista diferente intre securitate.

Topicul de forum nu a fost schimbat.