Try   HackMD

ADS B - Polosouvislý graf

Existuje-li mezi

u,v silná souvislost, pak stačí testovat polosouvislost pouze pro jeden z těchto vrcholů. Pokud bych tak provedl kondenzaci, výsledný graf již bude obsahovat pouze jednosměrné cesty.
Není-li takový graf ani slabě souvislý, pak je odpověď triviální. V opačném případě se jedná o DAG. Ten nebude polosouvislý v případě, bude-li se cesta ze zdrojové komponenty větvit.

Důkaz: Vezmu si dva vrcholy za větvením. Budu-li hledat cestu podle směru šipek, musí se v některém vrcholu cesty spojit. Jelikož však v takovém grafu není cyklus, musí obě šipky směřovat do daného vrcholu a nemohu tedy v cestě pokračovat. Naopak budu-li hledat cestu proti směru šipek, pak se dostanu k vrcholu, kde se cesta rozdělovala, a tak opět nemohu pokračovat dále.

To zároveň znamená, že se cesty ze zdrojových komponent nesmí ani spojovat. Požaduju-li slabou souvislost, pak výsledkem musí být pouze cesta. Tzn.: polosouvislý graf je takový, který je slabě souvislý a grafem komponent silné souvislosti je cesta.

Problém je v tom, že samotná kondenzace (kontrakce hran podle silné souvislosti) je náročná.
Mohu si však zaznamenat, z které komponenty jsem tuto komponentu objevil (což je pro DFS triviální záležitost). Navíc, objevím-li vrchol

v z vrcholu
u
, pak vrchol
u
objevím z
v
jen v případě, že leží ve stejné komponentě. Díky těmto informacím již mohu vytvořit graf komponent silné souvislosti (hrana
AB
existuje, vede-li alespoň jeden vrchol z
A
do vrcholu z
B
; obráceně nemůže, neboť vy vzniknul cyklus). Budu-li se držet algoritmu z Průvodce:

1. Otočím orientaci hran v grafu.
2.
Spouštím DFS z neprozkoumaných vrcholů.
3.
Jakmile otevřu vrchol, poznačím si, odkud jsem jej otevřel.
4.
Uzavřené vrcholy vložím do zásobníku.
5.
Jsou-li všechny vrcholy uzavřeny, jdu dál. Jinak
1.

6.
Vyndám vrchol ze zásobníku. Nemám-li označeno, v jaké komponentě leží, provedu DFS a objevené vrcholy označím číslem komponenty.
7.
Není-li zásobník prázdný,
5
. Jinak vytvoř prázdný (bezhranový) graf, kde vrcholy=komponenty.
8.
Pro každý vrchol zjisti, v jaké komponentě leží vrchol, který jej otevřel (otec - v
2
).
9.
Leží-li v jiné komponentě než momentální vrchol, vytvoř hranu otec
momentální vrchol
10.
Jakmile jsou všechny vrcholy prozkoumány, zjisti, zdali je graf cesta. Pokud ano, graf je slabě souvislý.

Složitost: DFS je lineární s velikostí grafu; ačkoli jej musím spouštět vícekrát, jdu pouze přes neprozkoumané vrcholy. Zaznamenávání vstupu je lineárně závislé na počtu vrcholů, stejně tak jako konstrukce finálního grafu.