# ADS B - Holubi Rozesílání holubů funguje jako průchod grafem do šířky: $1.$ Zvolím chovatele $a$ a pošlu všechny holuby. Adresáti také pošlou další holuby. BÚNO mě nazjímají holubi, kteří posílají zprávu již tomu, kdo ji dostal. $2.$ Tím zjistím, komu může $a$ přímo i nepřímo zprávu doručit. Pokud však je někdo, kdo nebyl obeslán, pak tento chovatel $b$ musí být schopen nějakým způsobem doručit zprávu $a$. Žádní jiní chovatelé dostupní z $a$ mě nezajímají, jelikož těm může odeslat zprávu $a$ $3a.$ Jestliže ani tohoto není schopen, pak hledám dalšího chovatele $c$, který nemůže být obeslán, a tento musí zaslat zprávu jak $a$, tak $b$, atd. $3b.$ Pokud $b$ může doručit zprávu $a$, tak chovateli $c$ stačí, aby byl schopen doručit zprávu $b$. Grafově: $0.$ Všechny vrcholy jsou na začátku neprozkoumané. Každý holub představuje výstupní hranu z vrcholu. $1.$ Vyberu náhodně jeden (neprozkoumaný) vrchol, označím jej jako volný vrchol. $2.$ Všechny vrcholy dosažitelné z volného vrcholu (pomocí BFS) označím jako prozkoumané. Do prozkoumaného vrcholu se již nevracím. Volný vrchol přepíšu na prozkoumaný jen v případě, je-li jiný než startovní vrchol. $3.$ Je-li ještě neprozkoumaný vrchol, $\to 1.$ $4.$ Zkontroluji počet volných vrcholů. Je-li jeden, pak existuje alespoň jedno řešení. Je-li jich více, pak řešení neexistuje. ![](https://i.imgur.com/LcJdyaS.png) Postup: $1.$ Z 1 prozkoumám 356, z 6 otevřu 1, ale nepřepíšu (jelikož je to tentýž BFS), 1. je volný $2.$ Z 2 prozkoumám 56, nic nedělám, 2. je volný $3.$ Z 4 prozkoumám 13, 1 přepíšu na prozkoumaný, 4. je volný. $4.$ Tento graf nemá řešení. Nejlepší výchozí vrchol by byl 4, pak ale by 2 nedostal zprávu. Správnost: Je-li ne-poslední volný vrchol dosažitelný z nějakého jiného vrcholu v rámci odlišného BFS (tzn. nenastane cyklus), pak jej mohu označit jako prozkoumaný. Tím pádem jsem zároveň schopen prozkoumat všechny vrcholy, které jsem prozkoumal z tohoto přepsaného vrcholu. Ačkoli startovní vrchol může být pouze jeden, není to jediné možné řešení; výchozími vrcholy mohou být všechny vrcholy, které tento vrchol mohou otevřít. (Tento vrchol mohu otevřít i "ručně", tzn. že jej zkrátka zvolím za startovní.) Nyní předpokládejme, že existují alespoň dva volné vrcholy. Mohu zvolit nějaký vrchol, který by otevřel oba? Ne, jelikož každý vrchol prozkoumávám jenom v rámci jednoho BFS, a tak by někdy v průběhu algoritmu muselo dojít k přepsání jednoho volného vrcholu na prozkoumaný, což je spor. $\square$ Složitost: Z každého vrcholu procházím sousedy pouze jednou, takže složitost odpovídá složitosti BFS, čili $\Theta (n+m)$.