From 25d2b24324729eea335cb231acbe272e00fd1195 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vojte=CC=8Cch=20Struha=CC=81r?= Date: Wed, 11 Jun 2025 22:43:07 +0200 Subject: [PATCH] Notes for graphs and graph algorithms --- src/content/docs/szmgr/SZP07_grafy.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/content/docs/szmgr/SZP07_grafy.md b/src/content/docs/szmgr/SZP07_grafy.md index d2bfef0..d52812d 100644 --- a/src/content/docs/szmgr/SZP07_grafy.md +++ b/src/content/docs/szmgr/SZP07_grafy.md @@ -135,6 +135,9 @@ Hledá nejkratší cesty z jednoho vrcholu do všech ostatních. - Využívá relaxaci hran. - Funguje i na grafech se zápornými hranami. - Má časovou složitost $\mathcal{O}(\lvert V \rvert \cdot \lvert E \rvert)$. +- Udělá max $V-1$ iterací, protože nejdelší cesta může mít max $V-1$ hran (přes žádný vertex nepůjdeš dvakrát). +- _Modifikace_: Po $V-1$ by už nejkratší cesty měly být nalezeny. Udělejme ještě jednu iteraci - pokud se hodnoty změní, pak nejkratší cesta obsahuje negativní cyklus. Viz python kód dole. +- _Modifikace_: Early stop - pokud se 2 interace po sobě hodnoty vrcholů nezmění, pak jsme našli nejkratší cesty. ```python def bellmanford(graph: List[List[Tuple[int, int]]], s: int) \ @@ -226,9 +229,9 @@ Dijkstrův algoritmus lze optimalizovat, pokud nás zajímá jen nejkratší ces - **Fundamental cutset / řez**\ Fundamental cutset je množina hran $D$ v grafu $G$ taková, že přidáním libovolné hrany $e \in D$ získáme kostru. - **Red rule**\ - Najdi cyklus bez červených hran, vyber v něm **neobarvenou** hranu s **nejvyšší** cenou a obarvi ji červeně. + Najdi cyklus bez červených hran, vyber v něm **neobarvenou** hranu s **nejvyšší** cenou a obarvi ji červeně. Červená hrana znamená odebrání z finální kostry. - **Blue rule**\ - Najdi řez bez modrých hran, vyber v něm **neobarvenou** hranu s **nejmenší** cenou a obarvi ji modře. + Najdi řez bez modrých hran, vyber v něm **neobarvenou** hranu s **nejmenší** cenou a obarvi ji modře. Modrá hrana znamená přidání do finální kostry. - **Greedy algoritmus**\ Nedeterministicky aplikuj red rule a blue rule, dokud to jde (stačí $n-1$ iterací). Modré hrany tvoří MST. - **Jarníkův / Primův algoritmus**\ @@ -305,7 +308,7 @@ Dijkstrův algoritmus lze optimalizovat, pokud nás zajímá jen nejkratší ces Je funkce $f: E \rightarrow \mathbb{R}^+$, která splňuje: - podmínku kapacity: $(\forall e \in E)(f(e) \ge 0 \land f(e) \leq c(e))$ - - _tok hranou je nezáporný a nepřevyšuje povolennou kapacitu_ + - _tok hranou je nezáporný a nepřevyšuje povolenou kapacitu_ - podmínku kontinuity: $(\forall v \in V \setminus \{s, t\})(\sum_{e \in \delta^+(v)} f(e) = \sum_{e \in \delta^-(v)} f(e))$ - _tok do vrcholu je stejný jako tok z vrcholu_ @@ -332,7 +335,7 @@ Dijkstrův algoritmus lze optimalizovat, pokud nás zajímá jen nejkratší ces $$ - **Augmenting path $P$**\ - Jednoduchá $s \rightsquigarrow t$ cesta v residuální síti $G_f$. + Jednoduchá $s \rightsquigarrow t$ cesta v residuální síti $G_f$. Cesty hledáš buď BFS nebo DFS - každou iteraci si prostě nějakou vybereš. > [!NOTE] > T.j. cesta která může jít i proti směru toku $f$. @@ -518,11 +521,11 @@ Dijkstrův algoritmus lze optimalizovat, pokud nás zajímá jen nejkratší ces **Srovnání algoritmů Ford-Fulkerson a Push-Relabel** -| Ford-Fulkerson | -| ----------------------- | ------------------------------------ | -| Push-Relabel (Goldberg) | global character | -| local character | update flow along an augmenting path | -| update flow on edges | flow conservation | +| Ford-Fulkerson | Push-Relabel (Goldberg) | +| ------------------------------------ | ----------------------- | +| global character | local character | +| update flow along an augmenting path | update flow on edges | +| flow conservation | preflow | ## Maximální párování v bipartitních grafech @@ -556,9 +559,6 @@ Dijkstrův algoritmus lze optimalizovat, pokud nás zajímá jen nejkratší ces ![width=300](./img/szp07_mcm_03.png) -[^ib000]: [IB000 Matematické základy informatiky (podzim 2022)](https://is.muni.cz/auth/el/fi/podzim2022/IB000/um/) -[^ib002]: [IB002 Algoritmy a datové struktury (jaro 2020)](https://is.muni.cz/auth/el/fi/jaro2020/IB002/um/) -[^ib003]: [IV003 Algoritmy a datové struktury II (jaro 2021)](https://is.muni.cz/auth/el/fi/jaro2021/IV003/um/) [^matching]: [Wikipedia: Párování grafu](https://cs.wikipedia.org/wiki/P%C3%A1rov%C3%A1n%C3%AD_grafu) [^mcm]: [Wikipedia: Maximum cardinality matching](https://en.wikipedia.org/wiki/Maximum_cardinality_matching)