#https://i...content-available-to-author-only...e.com/l9RYCl # #Dijkstrov algoritmus na najdenie najkratsej cesty z jedneho vrcholu do vsetkych # #n m - rozmery, pocet vrcholov a hran #v1 v2 vzd - pre kazdu hranu 2 vrcholy a ich vzdialenost #v - pociatocny vrchol import queue n, m = [int(_) for _ in input().split()] susedia = {} #slovnik vrchol -> zoznam hran ako dvojica (vzdialenost, vrchol) vzdialenosti = {} for i in range(n): #pre vsetky vrcholy A,B,... x = chr(ord('A')+i) #i-te pismeno v poradi susedia[x] = [] #prazdny zoznam susedov vrchola x vzdialenosti[x] = float('inf') #nekonecno print(susedia) print(vzdialenosti) for _ in range(m): #vsetky hrany v1, v2, vzd = [_ for _ in input().split()] vzd = int(vzd) susedia[v1].append( (vzd, v2) ) susedia[v2].append( (vzd, v1) ) v = input() print(n, m) print(v) for s in susedia: print(s, susedia[s]) mesta = queue.PriorityQueue() #prioritny rad na vyber vzdy najmensej vzdialenosti mesta.put( (0, v) ) #zaciname vo vrchole v so vzdialenostou 0 while not mesta.empty(): #pokial mame dalsie mesto na spracovanie vzd, mesto = mesta.get() #vyberieme dvojicu mesto a vzdialenost od pociatku print(vzd, mesto) if vzd < vzdialenosti[mesto]: #ak sme nasli kratsiu cestu vzdialenosti[mesto] = vzd #aktualizujeme na novu, kratsiu, vzdialenost for sused in susedia[mesto]: #pridame hrany k susedom #sused je dvojica (vzdialenost, vrchol) print(sused) mesta.put( (vzd+sused[0], sused[1]) ) #pridame novu vzdialenost k susedovi print(vzdialenosti)
7 11 A B 7 A D 5 B C 8 B D 9 B E 7 C E 5 D E 15 D F 6 E F 8 E G 9 F G 11 A
{'D': [], 'C': [], 'F': [], 'E': [], 'A': [], 'G': [], 'B': []} {'D': inf, 'C': inf, 'F': inf, 'E': inf, 'A': inf, 'G': inf, 'B': inf} 7 11 A D [(5, 'A'), (9, 'B'), (15, 'E'), (6, 'F')] C [(8, 'B'), (5, 'E')] F [(6, 'D'), (8, 'E'), (11, 'G')] E [(7, 'B'), (5, 'C'), (15, 'D'), (8, 'F'), (9, 'G')] A [(7, 'B'), (5, 'D')] G [(9, 'E'), (11, 'F')] B [(7, 'A'), (8, 'C'), (9, 'D'), (7, 'E')] 0 A (7, 'B') (5, 'D') 5 D (5, 'A') (9, 'B') (15, 'E') (6, 'F') 7 B (7, 'A') (8, 'C') (9, 'D') (7, 'E') 10 A 11 F (6, 'D') (8, 'E') (11, 'G') 14 A 14 B 14 E (7, 'B') (5, 'C') (15, 'D') (8, 'F') (9, 'G') 15 C (8, 'B') (5, 'E') 16 D 17 D 19 C 19 E 20 E 20 E 21 B 22 F 22 G (9, 'E') (11, 'F') 23 B 23 G 29 D 31 E 33 F {'D': 5, 'C': 15, 'F': 11, 'E': 14, 'A': 0, 'G': 22, 'B': 7}