Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pa:tmp:dn:laborator-12 [2022/05/23 10:53]
darius.neatu
pa:tmp:dn:laborator-12 [2022/05/24 15:38] (current)
radu.nichita
Line 37: Line 37:
 Puteți consulta capitolul **Maximum Flow** din **Introduction to Algorithms** [0] pentru mai multe detalii despre acești algoritmi. Puteți consulta capitolul **Maximum Flow** din **Introduction to Algorithms** [0] pentru mai multe detalii despre acești algoritmi.
  
-În acest laborator vom studia și analiza **metoda Ford-Fulkerson**,​ apoi vom implementa **algoritmul Edmonds-Karp** (care este o optimizarea ​peste Ford-Fulkerson).+În acest laborator vom studia și analiza **metoda Ford-Fulkerson**,​ apoi vom implementa **algoritmul Edmonds-Karp** (care este o optimizare ​peste Ford-Fulkerson).
  
 ===== Ford-Fulkerson ===== ===== Ford-Fulkerson =====
  
 Algoritmul lui [[https://​en.wikipedia.org/​wiki/​L._R._Ford_Jr.|Lester Randolph **Ford** Jr. ]] și [[https://​en.wikipedia.org/​wiki/​D._R._Fulkerson|Delbert Ray **Fulkerson**]],​ cunoscut ca și algoritmul / metoda [[https://​en.wikipedia.org/​wiki/​Ford%E2%80%93Fulkerson_algorithm|Ford-Fulkerson]] este un algoritm **greedy** pentru calcularea fluxului maxim într-o rețea de transport. Algoritmul lui [[https://​en.wikipedia.org/​wiki/​L._R._Ford_Jr.|Lester Randolph **Ford** Jr. ]] și [[https://​en.wikipedia.org/​wiki/​D._R._Fulkerson|Delbert Ray **Fulkerson**]],​ cunoscut ca și algoritmul / metoda [[https://​en.wikipedia.org/​wiki/​Ford%E2%80%93Fulkerson_algorithm|Ford-Fulkerson]] este un algoritm **greedy** pentru calcularea fluxului maxim într-o rețea de transport.
 +
 +Atât timp cât în graf încă există drumuri de ameliorare (augmenting paths), înseamnă că mai putem adauga flux in rețea prin acele drumuri. La fiecare pas alegem un drum de ameliorare, prin care adăugăm cantitatea maximă posibilă de flux.
  
 <spoiler Ford-Fulkerson - Pseudocod>​ <spoiler Ford-Fulkerson - Pseudocod>​
Line 50: Line 52:
 // nodes     = list of all nodes from G // nodes     = list of all nodes from G
 // edges     = the list of all edges in G // edges     = the list of all edges in G
-//             ​example:​ edge (node, neigh, ​weight)+//             ​example:​ edge (node, neigh, ​capacity)
 // S         = source in network G // S         = source in network G
 // T         = sink in network G // T         = sink in network G
Line 102: Line 104:
 // S         = source in network G // S         = source in network G
 // T         = sink in network G // T         = sink in network G
 +// f         = flow in network G
 +// c         = capacity in network G
 // //
 // returns: maxFlow (maximum flow in G from S to T) // returns: maxFlow (maximum flow in G from S to T)
Line 119: Line 123:
   while (BFS finds at least one augmenting path in G) {   while (BFS finds at least one augmenting path in G) {
     // STEP 2.1: Compute residual capacity of augmenting path.     // STEP 2.1: Compute residual capacity of augmenting path.
-    rc = +oo;+    rc = +oo; // residual capacity
     foreach ((u, v) in path) {     foreach ((u, v) in path) {
         rc = min(rc, c[ u ][ v ] - f[ u ][ v ]);         rc = min(rc, c[ u ][ v ] - f[ u ][ v ]);
Line 158: Line 162:
  
   * $1 - 2 - 4 - 6$ (capacitate reziduală **+1**)   * $1 - 2 - 4 - 6$ (capacitate reziduală **+1**)
-  * $1 - 3 - - 6$ (capacitate reziduală **+1**)+  * $1 - 3 - - 6$ (capacitate reziduală **+1**)
  
 === Exemplu Edmonds-Karp:​ exemplu simplu pas cu pas === === Exemplu Edmonds-Karp:​ exemplu simplu pas cu pas ===
Line 217: Line 221:
   * Observăm că pentru fiecare arc $(u, v)$ am dus un arc imaginar $(v, u)$ de capacitate **0**. Aceste arce fictive reprezintă cheia funcționării algoritmului Edmonds-Karp:​ de fiecare dată când vom pompa (adăuga) flux pe un arc $(u, v)$, vom scădea cu aceeași valoare fluxul pe arcul $(v, u)$.   * Observăm că pentru fiecare arc $(u, v)$ am dus un arc imaginar $(v, u)$ de capacitate **0**. Aceste arce fictive reprezintă cheia funcționării algoritmului Edmonds-Karp:​ de fiecare dată când vom pompa (adăuga) flux pe un arc $(u, v)$, vom scădea cu aceeași valoare fluxul pe arcul $(v, u)$.
  
-Să vedem în continuare la ce ne ajută dacă vom alegem din nou, ghinionist, drumul de amelioarare $1 - 2 - 5 - 6$ și dacă de data aceasta putem corecta. Vom face acțiunile marcate în figura următoare:+Să vedem în continuare la ce ne ajută dacă alegem din nou, ghinionist, drumul de amelioarare $1 - 2 - 5 - 6$ și dacă de data aceasta putem corecta. Vom face acțiunile marcate în figura următoare:
  
 {{https://​ocw.cs.pub.ro/​courses/​_media/​pa/​new_pa/​lab12-edmonds-karp-negative-flow-02.png?​512| Exemplu Edmonds-Karp}} {{https://​ocw.cs.pub.ro/​courses/​_media/​pa/​new_pa/​lab12-edmonds-karp-negative-flow-02.png?​512| Exemplu Edmonds-Karp}}
Line 250: Line 254:
 <spoiler Detalii (analiză + optimizări)>​ <spoiler Detalii (analiză + optimizări)>​
  
-  * **complexitate temporală**:​ Demonstrația se găsește în **Introduction to Algorithms**. Ideea de bază este că de fiecare dată când creștem fluxul pe un drum de amelioarare, o muchie devine saturată. Dacă vreodată această muchie va mai fi folosită în alt drum de ameliorare (în cazul unei corecții), aceasta va fi folosită într-un drum mai lung. Respectivele distanțe sunt monotone și limitate de $O(|V|)$. +  * **complexitate temporală**:​ Demonstrația se găsește în **Introduction to Algorithms**. Ideea de bază este că de fiecare dată când creștem fluxul pe un drum de ameliorare, o muchie devine saturată. Dacă vreodată această muchie va mai fi folosită în alt drum de ameliorare (în cazul unei corecții), aceasta va fi folosită într-un drum mai lung. Respectivele distanțe sunt monotone și limitate de $O(|V|)$.
- +
-The intuition is, that every time we find an augmenting path one of the edges becomes saturated, and the distance from the edge to will be longer, if it appears later again in an augmenting path. And the length of a simple paths is bounded by . +
   * **complexitate spațială** : Stocăm o coadă pentru algoritmul BFS. De asemenea, în implementare vom stoca și un vector de părinți pentru a putea parcurge un drum de ameliorare de la T la S (sens invers).   * **complexitate spațială** : Stocăm o coadă pentru algoritmul BFS. De asemenea, în implementare vom stoca și un vector de părinți pentru a putea parcurge un drum de ameliorare de la T la S (sens invers).
  
Line 313: Line 314:
  
 </​note>​ </​note>​
- 
-==== TODO ==== 
- 
-TODO: maybe cuplaj? 
  
 ==== BONUS ==== ==== BONUS ====
Line 324: Line 321:
 ==== Extra ==== ==== Extra ====
  
-TODO+  * [[https://​infoarena.ro/​problema/​cuplaj|infoarena/​cuplaj]] 
 +  * [[https://​infoarena.ro/​problema/​fmcm|infoarena/​fcmm]] 
 +  * [[https://​infoarena.ro/​problema/​drumuri2|infoarena/​drumuri2]] 
 +  * [[https://​infoarena.ro/​problema/​joc4|inforena/​joc4]] 
 +  * [[https://​acm.timus.ru/​problem.aspx?​space=1&​num=1533|acm/​fat-hobbits]]
  
 ===== Referințe ===== ===== Referințe =====
pa/tmp/dn/laborator-12.txt · Last modified: 2022/05/24 15:38 by radu.nichita
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0