znanci = { "Ana": {"Cilka", "Dani", "Micka"}, "Berta": {"Ema", "Nina", "Helga"}, "Cilka": {"Ana", "Micka", "Klara"}, "Dani": {"Ana", "Greta"}, "Ema": {"Nina", "Berta"}, "Fanči": {"Greta", "Liza"}, "Greta": {"Dani", "Fanči"}, "Helga": {"Berta", "Iva"}, "Iva": {"Nina", "Helga"}, "Jana": {"Klara", "Liza"}, "Klara": {"Cilka", "Liza", "Jana"}, "Liza": {"Fanči", "Micka", "Jana", "Klara"}, "Micka": {"Ana", "Cilka", "Liza"}, "Nina": {"Ema", "Berta", "Iva"} } def anjan(odkod, kam): vpr = set() niso_vpr = [odkod] for sprasujem in niso_vpr: if sprasujem in vpr: # 1 -> n continue vpr.add(sprasujem) # 1 -> n sosedi = znanci[sprasujem] # 1 -> n for sosed in sosedi: # n -> n * n niso_vpr.append(sosed) # 1 -> n if kam in niso_vpr: # n -> n * n return True # 1 return False def anjina_obljuba_n(odkod, kam): vpr = set() vprasati = [odkod] while vprasati: # n sprasujem = vprasati.pop(0) # 1 -> n if sprasujem in vpr: # 1 -> n continue vpr.add(sprasujem) # 1 -> n sosedi = znanci[sprasujem] # 1 -> n for sosed in sosedi: # n -> n * n vprasati.append(sosed) # 1 -> n if kam in vprasati: # n -> n * n return True # 1 return False def zala(odkod, kam): niso_vpr = [odkod] prejsnji = {} for sprasujem in niso_vpr: sosedi = znanci[sprasujem] for sosed in sosedi: if sosed not in prejsnji: prejsnji[sosed] = sprasujem niso_vpr.append(sosed) if kam in prejsnji: pot = [kam] while pot[-1] != odkod: pot.append(prejsnji[pot[-1]]) return pot[::-1] return False def zala_najkrajsa_ali_ne(odkod, kam): niso_vpr = [odkod] prejsnji = {} while niso_vpr: sprasujem = niso_vpr.pop(0) # če je pop(0), vrne najkrajšo pot; če samo pop(), pa ne nujno sosedi = znanci[sprasujem] for sosed in sosedi: if sosed not in prejsnji: prejsnji[sosed] = sprasujem niso_vpr.append(sosed) if kam in prejsnji: pot = [kam] while pot[-1] != odkod: pot.append(prejsnji[pot[-1]]) return pot[::-1] return False print(zala("Greta", "Klara"))