TOK V SÍTI - GOLDBERGŮV ALGORITMUS ================================== (c) 2002 Petr Čermák Síť je orientovaný vážený graf s dvěma označenými vrcholy - zdrojem a stokem. G=(V, E), z, s \in V, z != s, c: E -> R^{+}_{0}. Hodnotu c(e \in E) nazývame kapacitou hrany e. Tok v síti je zobrazení f: E->R^{+}_{0} splňující následující podmínky: (i) \forall e \in E: 0 <= f(e) <= c(e) (ii) \forall u \in V, u != z, s: sum_{x, xu \in E} f(xu) = sum_{x, ux \in E} f(ux) Velikost toku je pak číslo w(f) = sum_{x, zx \in E} f(zx) - sum_{x, xz \in E} f(xz) (= sum_{x, xs \in E} f(xs) - sum_{x, sx \in E} f(sx) ). Nejčastější úlohou je pak hledání maximálního toku (s maximální w). Dalším potřebným pojmem je řez Ř \subset E: v G(V, U\Ř) neexistuje žádná orientovaná cesta ze z do s. Kapacitou (velikostí) řezu pak rozumíme c(Ř)=sum_{e \in Ř} c(e). V každé takovéto síti existuje maximální tok fM. Pro fM navíc platí, že w(fM)=c(Řm), kde Řm je řez s minimální velikostí. Program se zabývá pouze speciální množinou sítí s celočíselnými kapacitami. Platí, že pokud jsou všechny kapacity celočíselné, pak existuje celočíselný maximální tok. Na jeho nalezení existuje několik různých algoritmů většinou hledající vylepšující cestu (Ford-Fulkerson, Dinic, 3-Indové). Program však implementuje Goldbergův algoritmus který nehledá vylepšující cestu, ale pracuje na jiném, velmi jednoduchém principu. Goldbergův algoritmus pracuje s modifikovanou definicí toku a to tzv. vlnou, která připouští v každém vrcholu přebytek: sum_{x, xu \in E} f(xu) >= sum_{x, ux \in E} f(ux). Pokud však již nemáme v žádném vrcholu přebytek (kromě zdroje, který má +oo a stok -oo), je tento tok shodný s původní definicí. Pro každý vrchol budeme ještě udržovat informaci o výšce. Pracuje se se sítí rezerv, kde každá hrana e je ohodnocena číslem c(e) - f(e). Přidáme i hrany opačně orientované s nulovou kapacitou. Definujeme f(e)=-f(e opačná). Označíme r(e)=c(e)-f(e). Algoritmus pracuje v následujících krocích: (i) Vstup - všechny vrcholy výšky nula, všude nulový přebytek. (ii) Zvedni zdroj do výšky n, kde ne je počet vrcholů. A pusť hranami vycházejícími ze zdroje tok odpovídající jejich kapacitě. (iii) Pokud existuje vrchol s kladným přebytkem a pokud existuje jeho nějaký soused s menší výškou a hrana mezi nimi je nenasycená (f(e) vnitřní reprezentace grafu muj2v(GrafAlg+, GrafVV-) naopak