Pagini recente » Istoria paginii runda/pregatire_agm_2019/clasament | Diferente pentru warm-up-2019/solutii/shoturi intre reviziile 99 si 15 | Istoria paginii runda/mm/clasament | Atasamentele paginii Profil Anne-Marie | Diferente pentru flux-si-cuplaj intre reviziile 35 si 21
Nu exista diferente intre titluri.
Diferente intre continut:
int t[N];
int n, m;
int bfs (int source, int sink)
int bfs(int source, int sink)
{
int Q[N + 1], p = 0, q = 0;
int Q[N+1], p=0,q=0;
bool use[N];
memset (use, 0, sizeof (use));
memset (t, 0, sizeof (t));
Q[0] = source;
use[source] = 1;
memset(use, 0, sizeof(use));
memset(t, 0, sizeof(t));
Q[0]=source;
use[source]=1;
while (p <= q)
while(p<=q)
{
int u = Q[p++]; //scoatem primul element din coada
int u=Q[p++];//scoatem primul element din coada
for (int i = source;i <= sink;++i) // pt fiecare nod ( adiacent )
if (!use[i]) // nu am folosit nodul
if (cap[u][i] - flux[u][i] > 0) // mai putem pompa?
for(int i=source;i<=sink;++i) // pt fiecare nod ( adiacent )
if(!use[i]) // nu am folosit nodul
if(cap[u][i] - flux[u][i] > 0) // mai putem pompa?
{
Q[++q] = i; // inseram nodul i in coada
t[i] = u;
use[i] = 1;
Q[++q]=i; // inseram nodul i in coada
t[i]=u;
use[i]=1;
}
}
if (t[sink])
return 1;
if(t[sink]) return 1;
return 0;
}
int edmond-karp (int source, int sink)
int edmond-karp(int source, int sink)
{
int flow = 0; //fluxul
int flow=0; //fluxul
int i, min;
while (bfs (source, sink)) // cat timp mai exista un drum de ameliorare
while(bfs(source, sink)) // cat timp mai exista un drum de ameliorare
{
min = oo;
for (i = sink; i; i = t[i])
if (cap[ t[i] ][i] - flux[ t[i] ][i] < min)
min = cap[ t[i] ][i] - flux[ t[i] ][i];
//calculam minimul dintre capacitatile ramase de pe drum
for (i = sink ; i; i = t[i])
flux[ t[i] ][i] += min, //adaugam minimul la fluxul de pe arcele de pe drum
flux[i][ t[i] ] -= min; //scadem minimul de pe arcele inverse
min=oo;
for(i=sink; i; i=t[i])
if(cap[t[i]][i] < min) min=cap[t[i]][i]; //calculam minimul dintre capacitatile de pe drum
for(i=sink ; i; i=t[i])
flux[t[i]][i]+=min, //adaugam minimul la fluxul de pe arcele de pe drum
flux[i][t[i]]-=min; //scadem minimul de pe arcele inverse
flow += min; // adaugam minimul la flux
flow+=min; // adaugam minimul la flux
}
return flow;
}
min=oo;
if(cap[j][sink]-flux[j][sink] < min) min=cap[j][sink]-flux[j][sink];
if(cap[j][sink] < min) min=cap[j][sink];
for(i=j; i; i=t[i])
if(cap[t[i]][i]-flux[t[i]][i] < min) min=cap[t[i]][i]-flux[t[i]][i];
//calculam minimul dintre capacitatile de pe drum
if(cap[t[i]][i] < min) min=cap[t[i]][i]; //calculam minimul dintre capacitatile de pe drum
if(min == oo) continue;
}
==
h2. Grafuri bipartite
Cuplaj maxim, Multime independentă maximală, Suport minim
Un graf bipartit este un graf G = (V, E) în care mulţimea V poate fi partiţionată în două mulţimi, V1 şi V2 astfel încât orice muchie (u, v) C E implică fie că u C V1 şi v C V2 fie că u C V2 şi v C V1. Cu alte cuvinte, toate muchiile merg de la mulţimea V1 la mulţimea V2 sau invers.
Proprietăţile grafurilor bipartite sunt:
1. G este 2-colorabil (adică nodurile pot fi colorate în 2 culori astfel încât orice muchie sa aiba noduri colorate diferit)
2. G nu are cicluri de lungime impară
În grafurile bipartite anumite probleme care erau NP pe grafuri normale, se pot rezolva în timp polinomial. Exemple de astfel de probleme sunt: cuplaj maxim, mulţime independentă maximală şi suport minim.
h3. Cuplaj Maxim
Fiind dat un graf neorientat G = (V, E), un cuplaj este o submulţime de muchii M astfel încât pentru toate vârfurile v C V, există cel mult o muchie în M incidentă în v. Spunem că un vârf v C V este cuplat de cuplajul M dacă există cel mult o muchie în M incidentă în v; altfel spunem ca v este neconectat. Un cuplaj maxim este un cuplaj de cardinalitate maximă.
!flux-si-cuplaj?cuplaj1.jpg!
În imagine: un graf bipartit G = (V, E) cu partiţia vârfurilor V = L U R. (a) Un cuplaj de cardinalitate 2. (b) Un cuplaj maxim de cardinalitate 3.
Pentru a determina cuplajul maxim vom transforma graful bipartit într-o reţea de transport adaugând un nod sursa (s)si un nod destinaţie (t) şi vom pune capacitate 1 pe toate muchiile.
Reţeaua de transport corespunzătoare grafului de mai sus:
!flux-si-cuplaj?cuplaj2.jpg!
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. 10. 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) |
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
}
}
==
h2. Mulţime independentă maximală
Într-un graf bipartit o mulţime independentă maximală reprezintă o mulţime de noduri astfel încât oricare 2 noduri din mulţime să nu fie legate printr-o muchie iar orice muchie din graf să aiba unul din noduri în mulţimea independentă.
O proprietate interesantă a unei mulţimi independente maximale este aceea că ea este fie o clică maximală fie un subgraf complet în graful complementar.
Mulţimea independentă maximală este complementul oricărui suport minim în sensul că daca avem un suport minim, o mulţime independentă maximală va fi formată din nodurile care nu aparţin suportului minim.
Nu exista diferente intre securitate.
Topicul de forum nu a fost schimbat.