Domáca úloha č.2

Nech A je komutatívna grupa a nech d je metrika na A. Tok na grafe G je priradenie orientácií a hodnôt z A hranám grafu také, že pre každý vrchol, súčet hodnôt na vchádzajúcich hranách sa rovná súčtu hodnôt na vychádzajúcich hranách. Tok nazývame nikde-nulový r-tok ak pre všetky hodnoty x priradené hranám platí r-1 >= d(x,0) >=1. Najmenšie r pre ktoré má graf takýto nikde-nulový r-tok nazývame (A, d)-tokové číslo grafu G.
  1. Vytvorte funkciu double rflow(std::vector<std::vector<int>> graph);. Táto funkcia vypočíta (A, d)-tokové číslo grafu pre A=ℝ a d(x,y)=|x-y|. To znamená, že v nikde nulovom r-toku môžete ako tokové hodnoty používať reálne čísla z [-(r-1),-1] ∪ [1, r-1].
  2. Vytvorte funkciu double r2chebyshevflow(std::vector<std::vector<int>> graph);. Táto funkcia vypočíta (A, d)-tokové číslo grafu pre A=ℝ2 a d((x1,y1),(x2,y2))=max{|x1-x2|,|y1-y2|}. To znamená, že v nikde nulovom r-toku môžete ako tokové hodnoty používať dvojice reálnych čísel také, že aspoň jedna zložka je v absolútnej hodnote väčšia rovná 1.
Graf je reprezentovaný nasledovne. Graf má graph.size() vrcholov, ktoré sú označené číslami od 0 po graph.size()-1. Hrana medzi vrcholmi i a j existuje práve vtedy, keď graph[i] obsahuje j a graph[j] obsahuje i. Navyše graph[i] obsahuje j práve vtedy, keď graph[j] obsahuje i (graf je neorientovaný). Môžete predpokladať, že vstupný graf je kubický a bezmostový a že optimálna hodnota r je nanajvýš 6 (vyplýva to zo Seymourovej vety o 6-toku). Problémy vyriešte konverziou na celočíselné lineárne programovanie. Ako nástroj na výpočet lineárneho programovania a celočíselného lineárneho programovania použite lp_solve. Na uľahčenie práce sme napisali malý wrapper (nemusíte ho použiť, objekt primárne zabaľuje C-čkovský interface, do C++-kovskej triedy). Zoznam funkcií knižnice lpsolve nájdete tu. Naprogramovali sme pre vás malý ukážkový projekt.

⚠ Pokiaľ nenastavíte inak, premenné v lp_solve sú nezáporné. Ak chcete, aby vaše premenné nadobúdali záporné hodnoty, musíte použit funkciu set_bounds. ⚠

Na testovanie mňžete použiť Pripájame vybrané grafy v textovom formáte.

Riešenie odovzdajte do 29.4. vrátane (v SEČ) majlom na adresu lukotka.pts@gmail.com ako jeden súbor s názvom nowhere_zero_flows.cpp. Tento súbor nemá obsahovať funkciu main a ani by nemal mať neželané side effecty. Upozorňujem, neposielajte teraz ani v budúcnosti na adresu lukotka.pts@gmail.com nič iné ako samotné odovzdanie riešenia domácich úloh (na túto adresu sa prihlasujem iba keď sťahujem domáce úlohy a posielam feedback).