#!/usr/bin/env python3 # 27-Z2-5 Hledání stromů # Príklad vstupu: # 5 # 1: 2,3 # 2: 1 # 3: 1,4,5 # 4: 3 # 5: 3 # Rekurzia prehľadávania do hĺbky # Vstupné parametre: aktuálne prehľadávaný vrchol a pôvodný vrchol (z ktorého sme prišli) # Návratová hodnota: True ak graf obsahuje cyklus def DFS(aktualny, povodny): navstivene[aktualny] = True # Aktuálny vrchol pridáme medzi navštívené for sused in graf[aktualny]: # Prejdeme všetkých susedov aktuálneho vrcholu if sused == povodny: # Ignorujeme suseda, ktorý je pôvodný vrchol continue if navstivene[sused]: # Ak sme už suseda navštívili, znamená to, že graf obsahuje cyklus return True if DFS(sused, aktualny): # Rekurzívne prehľadáme suseda return True # A ihneď vrátime True ak sme v rekurzii detegovali cyklus return False def main(): global graf global navstivene N = int(input()) # Z prvého riadku načítame počet vrcholov graf = [[]]*(N+1); # Pole graf - Pre každý vrchol si budeme pamätať zoznam susedov, naviac indexujeme od jedničky (nultý prvok bude nevyužitý) navstivene = [False]*(N+1) # Pole navštívené - Pre každý vrchol informácia, či už bol navštívený (opäť indexovanie od jedničky) for i in range(1, N+1): riadok = input().split(":") # Načítame riadok vstupu a rozdelíme ho podľa znaku ":" vrchol = int(riadok[0]) # Prvá časť riadku (pred ":") obsahuje číslo vrcholu susedia = list(map(int, riadok[1].split(","))) # Druhá časť riadku obsahuje čiarkou oddelený zoznam susedov -- uložíme ich ako zoznam čísel graf[vrchol] = susedia if DFS(1, None): # Spustíme prehľadávanie do hĺbky z prvého vrcholu print("Graf obsahuje cyklus") return for vrchol in range(1, N+1): if not navstivene[vrchol]: # Skontrolujeme, či každý vrchol grafu sme pri prehľadávaní navštívili print("Graf nie je suvisly") return print("Graf je stromom") # Ak graf neobsahuje cyklus a je súvislý, tak je stromom if __name__ == "__main__": main()