Diferente pentru problema/flux1 intre reviziile #40 si #58

Nu exista diferente intre titluri.

Diferente intre continut:

== include(page="template/taskheader" task_id="flux1") ==
Fie un graf orientat cu $N$ noduri si $M$ muchii. $V$ este multimea nodurilor din graf, iar $E$ multimea muchiilor. Asociem fiecarei muchii $(u,v)$ o capacitate nenegativa $cap(u,v)$. Consideram doua varfuri speciale: nodul $1$ care va fi denumit $sursa$ si nodul $N$, denumit $destinatie$. Orice nod $i$ ({$2 ≤ i ≤ N-1$}) se gaseste pe cel putin un drum de la $1$ la $N$. Definim *fluxul* in graf ca fiind o functie _f: VxV -> Z_. Functia _f_ satisface urmatoarele conditii:
Fie un graf orientat cu $N$ noduri si $M$ muchii. $V$ este multimea nodurilor din graf, iar $E$ multimea muchiilor. Asociem fiecarei muchii $(u,v)$ o capacitate nenegativa $cap(u,v)$. Consideram doua varfuri speciale: nodul $S$ care va fi denumit $sursa$ si nodul $D$, denumit $destinatie$ ({$1 ≤ S,D ≤ N$}). Orice nod $i$ ({$1 ≤ i ≤ N$}) se gaseste pe cel putin un drum de la $S$ la $D$. Definim *fluxul* in graf ca fiind o functie $f$: $VxV$ -> $*Z*$. Functia $f$ satisface urmatoarele conditii:
# este restrictionata de capacitate, adica ∀ ($i$, $j$) ∈ $E$ avem $f(i,j) ≤ cap(i,j)$
# este antisimetrica, adica $forall; ($i$, $j$) ∈ $E$ avem $f(i,j) = -f(j,i)$
# fluxul se conserva, adica &forall; $i$ &isin; $V\{1,N}$ valoarea fluxului care intra in nodul respectiv este egala cu valoarea fluxlui care iese din nodul respectiv (&forall; $i$ &isin; $V$ avem <tex>\sum_{(j,i) \in E}^{} f(j,i) = \sum_{(i,k) \in E}^{} f(i,k)</tex>
 
Valoarea fluxului este <tex>F = \sum_{(1,i) \in E}^{} f(1,i)</tex>, adica fluxul total care pleaca din nodul sursa.
# este restrictionata de capacitate, adica &forall; $i$, $j$ &isin; $V$ avem $f(i,j) &le; cap(i,j)$
# este antisimetrica, adica &forall; $i$, $j$ &isin; $V$ avem $f(i,j) = -f(j,i)$
# &forall; $i$ &isin; $V$ avem <tex>\sum_{j \in V}^{} f(i,j) = 0</tex>
Valoarea fluxului este <tex>F = \sum_{(S,i) \in E}^{} f(S,i)</tex>, adica fluxul total care pleaca din nodul sursa.
h2. Cerinta
Se cere sa se determine valorile functiei _f_ pentru fiecare muchie (i,j) astfel incat valoarea fluxului sa fie maxima.
Se cere sa se determine valoarea maxima a fluxlui.
h2. Date de intrare
h2. Restrictii
* $1 &le; N &le; 200$
* $1 &le; N &le; 2000$
* pentru $50%$ din teste $1 &le; N &le; 200$
* $1 &le; M &le; N*(N-1)$
* capacitatea fiecarei muchii este un numar natural nenul mai mic sau egal cu $10 000 000$.
* daca, in fisierul de intrare, exista muchia $(a,b)$ poate sa existe si muchia $(b,a)$
* capacitatea fiecarei muchii este un numar natural nenul mai mic sau egal cu $10 000 000$
* daca exista muchia $(a,b)$ in fisierul de intrare, poate sa existe si muchia $(b,a)$
* fluxul maxim va fi &le; $2 000 000 000$
h2. Exemplu
table(example). |_. flux1.in |_. flux1.out |
| 6 12
1 2 6
1 3 3
3 4 5
4 5 4
5 6 4
3 6 100
2 4 3
4 3
1 3 5
1 5 4
1 3 6
4 6 5
2 3 5
3 6 4
| 13
2 1 3
2 6 5
4 2 6
4 3 3
4 5 4
4 6 6
5 3 4
6 1 5
6 2 4
6 3 100
| 19
|
h2. Indicatii de rezolvare
h3. Solutia de 50 de puncte
 
Problema se rezolva cu ajutorul algoritmului "Ford Fulkerson":http://en.wikipedia.org/wiki/Ford-Fulkerson_algorithm, care are urmatorii pasi.
# se cauta un drum de la sursa (in cazul nostru, nodul $1$) la destinatie (in cazul nostru $N$) cu orice algoritm (bfs, dfs, etc.) si fie acesta $1->i~1~->i~2~->...->i~k~->N$
# de pe acest drum se alege muchia de capacitate minima (fie ea $cmin$)
# se cresc cu $cmin$ $f(1,i~1~), f(i~1~,i~2~), ..., f(i~k~,N)$ si cu $cmin$ $f(i~1~,1), f(i~2~,i~1~), ..., f(N,i~k~)$
# se cauta un drum de la sursa la destinatie (fie acesta $1 -> i{~1~} -> i{~2~} -> ... -> i{~k~} -> N$) cu proprietatea ca pentru oricare doua noduri adiacente (pe drum) $i$ si $j$, $0 &lt; f(i,j) &le; cap(i,j)$
# se alege muchia pentru care valoarea $cap(i,j)-f(i,j)$ este minima (fie ea $cmin$), unde $i$ si $j$ sunt doua noduri adiacente (pe drum)
# se cresc cu $cmin$ $f(1,i{~1~}), f(i{~1~},i{~2~}), ..., f(i{~k~},N)$ si se scad cu $cmin$ $f(i{~1~},1), f(i{~2~},i{~1~}), ..., f(N,i{~k~})$
# se creste valoarea fluxul total cu $cmin$
# algoritmul se repeta de la pasul $1$
O descriere detaliata a algoritmului o gasiti "aici":http://www.topcoder.com/tc?module=Static&d1=tutorials&d2=maxFlow.
h3. Solutia de 100 de puncte
 
Abordarea lui Ford Fulkerson nu poate fi folosita pentru obtinerea punctajului maxim, din cauza complexitatii prea mari. Exista, insa, doi algoritmi care efectueaza mult mai putine operatii si care pot rezolva problema fluxlui maxim pentru limitele date:
 
# algoritmul lui Dinic, avand complexitatea $O(N^2^*M)$.
# algoritmul lui Karzanov (mai greu de implementat), avand complexitatea $O(N^3^)$
 
Ambele abordari impreuna cu mai multa teorie despre flux maxim in retele au fost inglobate intr-un "articol":http://infoarena.ro/downloads?action=download&file=flux_maxim_in_retele.doc de catre Mugurel Ionut Andreica.
 
h2. Probleme asemanatoare
 
* PKU = "Ombrophobic Bovines":http://acm.pku.edu.cn/JudgeOnline/problem?id=2391
* infoarena = "Critice":http://infoarena.ro/problema/critice
* infoarena = "Tero":http://infoarena.ro/problema/tero
 
== include(page="template/taskfooter" task_id="flux1") ==

Nu exista diferente intre securitate.

Topicul de forum nu a fost schimbat.