Nu aveti permisiuni pentru a descarca fisierul grader_test7.ok
Diferente pentru problema/fmcm intre reviziile #35 si #18
Nu exista diferente intre titluri.
Diferente intre continut:
== include(page="template/taskheader" task_id="fmcm") ==
Se da o retea de transport sub forma unui graf orientat cu $N$ noduri si $M$ arce. Fiecare arc are asociatao capacitate si un cost pentru fiecare unitate de fluxcetrecepe arcul respectiv.Notamcu $S$ si $D$ sursa si respectiv destinatiadinreteaua detransport considerata. Sa se determine costul minim pentru a se transmite o cantitate maxima de flux de la sursa la destinatie.
Se da o retea de transport sub forma unui graf orientat cu $N$ noduri si $M$ arce. Fiecare arc are asociate o capacitate si un cost pentru fiecare unitate de flux. In graf se afla $2$ noduri distincte, notate cu $S$ si $D$, ce reprezinta sursa si, respectiv, destinatia retelei. Sa se determine costul minim pentru a se transmite o cantitate maxima de flux de la sursa la destinatie.
h2. Date de intrare
Pe prima linie a fisierului de intrare $fmcm.in$, se afla $4$ numere intregi $N M S D$ cu semnificatia din enunt. Pefiecare dinurmatoarele $M$ linii se afla cate $4$ numere $x y c z$, reprezentand un arc de la $x$ la $y$ cu capacitatea $c$ si costul $z$.
Pe prima linie a fisierului de intrare $fmcm.in$, se afla $4$ numere intregi $N M S D$ cu semnificatia din enunt. Pe urmatoarele $M$ linii se afla cate $4$ numere $x y c z$, fiecare astfel de grup reprezentand un arc de la $x$ la $y$ cu capacitatea $c$ si costul $z$.
h2. Date de ieşire
* $1 ≤ M ≤ 12 500$ * $1 ≤ c ≤ 10 000$ * $-1 000 ≤ z ≤ 1 000$
* Se garanteaza ca graful nu va avea cicluri negative * Se garanteaza ca nu exista nici un arc care sa intre in $S$ si nici un arc care sa iasa din $D$ *Intreoricaredouanoduri $x$si$y$existamaxim un arc.In plus,daca exista arcintre $x$si$y$ nu va exista arcintre $y$si$x$
* Se garanteaza ca graful nu va avea cicluri negative. * Se garanteaza ca nu exista nici un arc care sa intre in $S$ si nici un arc care sa iasa din $D$. * Pentru simplitate, vom considera ca daca exista arc de la $x$ la $y$, atunci el este unic si nu va exista arc de la $y$ la $x$.
* Pentru $50%$ din teste $N ≤ 50$ si $M ≤ 200$
* Pentru $70%$ din teste $N ≤200$ si $M ≤7500$
* Pentru $70%$ din teste $N ≤ 300$ si $M ≤ 10 000$
h2. Exemplu table(example). |_. fmcm.in |_. fmcm.out |
| 5 725317-11430343-415704511258-323 4-3|-42
| 5 7 1 5 1 2 9 5 1 3 2 4 2 3 3 3 2 4 2 1 3 4 2 2 3 5 10 7 4 5 3 4 | 86
| h2. Indicatii de rezolvare
Aceasta problema se rezolva in mod asemanator cu problema determinarii 'fluxului maxim':problema/maxflow, cu cateva modificari. Este din nou necesara constuirea _grafului rezidual_,care continetoatearcele din grafulinitial si, in plus, toate {_arcele de intoarcere_}.Astfel,pentru fiecare arc{$x->y$}de cost $z$ din graful initial se adaugaingrafulrezidualarculy->xcu capacitatea $0$ si costul {$-z$}. Algoritmul ruleaza atat timp cat se mai poate introduce flux in retea. La fiecare pas, este necesara gasirea unui_drum deameliorare_decost minim de la sursa la destinatie. Apoi, fluxul va fi incrementat pe acest drum cu valoarea maxima posibila (minimul diferentelordintre capacitate si flux pentru fiecarearc de pe drum). Pentru a gasi drumul de ameliorare optimdin punctdevederealcostuluiputemfolosiunalgoritm dedrum minimcaresapermita existentacosturilor negative pe arce(costurile arcelorde intoarcere),precum "Bellman-Ford":http://en.wikipedia.org/wiki/Bellman_Ford.Algoritmul Bellman-Ford are complexitate $O(N*M)$, ceea ce conduce la o complexitate teoretica $O(N^2^*M^2^)$, insa in practica se comporta mai bine. Aceasta solutie obtine $50$ de puncte.Osursa pe aceasta idee poate fi gasita 'aici':job_detail/238401?action=view-source. Algoritmul Bellman-Ford poate fi rafinat folosind o coada pentru a mentine nodurile ce mai pot contribui la imbunatatirea costurilor. Desi complexitatea ramane aceeasi, in practica timpul de rulare scade simtitor. O astfel de abordare obtine $70$ de puncte.Osursa demonstrativa poate fi gasita 'aici':job_detail/238402?action=view-source.
Aceasta problema se rezolva in mod asemanator cu problema determinarii 'fluxului maxim':problema/maxflow, cu cateva modificari. Este din nou necesara constuirea _grafului rezidual_, in felul urmator: pentru fiecare arc din graful initial se mai adauga cate un arc (arc de intoarcere) orientat invers cu capacitatea $0$ si cu costul opus ({$-z$}). Algoritmul ruleaza atat timp cat se mai poate introduce flux in retea. La fiecare pas, este necesara gasirea unui drum de cost minim vaid (fluxul de pe fiecare arc sa fie strict mai mic decat capacitatea) de la sursa la destinatie numit _drum de augmentare_. Apoi, fluxul va fi incrementat pe acest drum cu valoarea maxima posibila (minimul din diferentele dintre capacitate si flux pentru fiecare muchie de pe drum). Pentru a gasi drumul de augmentare, o alternativa ar fi sa folosim algoritmul "Bellman-Ford":http://en.wikipedia.org/wiki/Bellman_Ford, datorita prezentei costurilor negative pe arce. Chiar daca $z ≥ 0$, arcele de intoarcere ar fi tot negative, deci si cu aceasta restrictie drumul de augmentare ar trebui cautat tot cu algoritmul Bellman-Ford. Acest algoritm are complexitate $O(N*M)$, ceea ce conduce la o complexitate totala $O(N^2^*M^2^)$, insa in practica se comporta mai bine. Aceasta solutie obtine $50$ de puncte; o sursa ce implementeaza aceasta idee poate fi gasita 'aici':job_detail/238401?action=view-source. Algoritmul Bellman-Ford poate fi rafinat folosind o coada pentru a mentine nodurile ce mai pot contribui la imbunatatirea costurilor. Desi complexitatea ramane aceeasi, in practica, timpul de rulare scade simtitor. O astfel de abordare obtine $70$ de puncte si o sursa demonstrativa poate fi gasita 'aici':job_detail/238402?action=view-source.
Pentru aimbunatati algoritmul de maisus, atuncicandcautam drumul de ameliorarede costminimputemfolosi si 'algoritmul lui Dijkstra':problema/dijkstra, dar inainte graful trebuie modificat astfel incat sa nu mai exista arce cu cost negativ. Definim $Dist{~i~}$ca fiinddistanta minima de la $S$ la nodul $i$. Initial, folosind algoritmul lui Bellman-Ford,calculamvalorile vectorului$Dist$. Apoi,fiecarui arc{$x->y$}de cost $z$ i sevaasociacostul$z + Dist{~x~}- Dist{~y~}$. Costul arcelor devine pozitiv, altfel ar insemna ca $Dist{~x~}+ z < Dist{~y~}$, ceea ce ar contrazice minimalitatea lui $Dist{~y~}$. Costul drumurilor minime difera fata de cele initale printr-oconstanta, deci transformareamodifica doar costul acestora sinuleschimbacu altedrumuri.Inconsecinta, la fiecare pas vom putea folosi algorimul lui Dijkstra pentru a determina drumul de ameliorare si vom putea folosi distantele calculate cu acest algoritm pentru a modifica din nou costurile arcelor. Algoritmul lui Dijkstra are complexitate $O(M*logN)$,deci complexitatea totaladevine$O(N*M^2^*logN)$, dar esteiarasisupraestimata. Aceasta rezolvare obtine $100$ de puncte,iaro sursademonstrativasegaseste 'aici':job_detail/245450?action=view-source.
Pentru a gasi drumul de augmentare, poate fi folosit si 'algoritmul lui Dijkstra':problema/dijkstra, dar inainte graful trebuie modificat astfel incat sa nu mai exista arce cu cost negativ. Definim $Dist[i]$ distanta minima de la $S$ la nodul $i$. Initial, folosind algoritmul lui Bellman-Ford calculam $dist[i]$. Apoi costul fiecarui arc $z[x-y]$ va fi inlocuit cu $z[x->y] + Dist[x] - Dist[y]$. Costul arcelor devine pozitiv, altfel ar insemna ca $Dist[x] + z[x->y] < Dist[y]$, ceea ce ar contrazice minimalitatea lui $Dist[y]$. Costul drumurilor minime difera fata de cele initale prin constanta $Dist[x]-Dist[y]$, deci transformarea nu schimba drumul minim. Apoi, la fiecare pas vom putea folosi algorimul lui Dijkstra pentru a determina drumul de augmentare si vom putea folosi distantele calculate cu acest algoritm pentru a modifica din nou costurile arcelor. Algoritmul lui Dijkstra are complexitate $O(MlogN)$ si complexitatea totala este O(N*M^2^*logN), din nou supraestimata. Aceasta rezolvare obtine $100$ de puncte si o sursa ce foloseste aceasta idee se afla 'aici':.
h2. Aplicatii
Algoritmul de flux maxim si cost minim poate fi aplicat si pentru grafuri neorientate cu modificari minime. In plus, poate fi aplicat si pentru determinarea cuplajului de cost minim intr-un graf bipartit. De asemenea, putem determina si cuplajul de cost maxim intr-un graf biparit, folosind acelasi algoritm dupa ce costul fiecarei muchii a fost inlocuit cu diferenta dintre valoarea maxima a unei muchii si valoarea curenta. In acest caz, rezultatul va fi egal cu diferenta dintre produsul fluxului si valoarea maxima a unei muchii si costul fluxului obtinut pe graful modificat. Rezolvarea urmatoarelor probleme foloseste ideile de mai sus:
Pentru a determina cuplajul de cost minim intr-un graf bipartit se foloseste acelasi algoritm ca cel prezentat in aceasta problema. De asemenea, pentru a determina cuplajul de cost maxim intr-un graf biparit, folosim acelasi algoritm dupa ce costul fiecarei muchii a fost inlocuit diferenta dintre valoarea maxima a unei muchii si valoarea curenta. In acest caz, rezultatul va fi egal cu diferenta dintre produsul fluxului si valoarea maxima a unei muchii si costul fluxului obtinut pe graful modificat. Algoritmul prezentat in aceasta problema este necesar pentru a rezolva mai multe probleme de informatica, cum ar fi:
* 'Cc':problema/cc * 'Traseu':problema/traseu * 'Renovare':problema/renovare * 'Smen':problema/smen * 'Adapost':problema/adapost
*'Atac2':problema/atac2== include(page="template/taskfooter" task_id="fmcm") ==
== include(page="template/taskfooter" task_id="fmcm") ==
Nu exista diferente intre securitate.
Diferente intre topic forum:
3570