Xinef

Dijkstra rozwiązanie

May 15th, 2025 (edited)
483
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.19 KB | Source Code | 0 0
  1. import math
  2. import time
  3.  
  4.  
  5.  
  6. def rysujGraf(x: int, y: int, graf):
  7.   #top bar
  8.   foo = '/'
  9.   for i in range(0,x-1):
  10.     foo = foo + '----'
  11.   print(foo+'---\\')
  12.  
  13.   # rows
  14.   for iy in range(0,y):
  15.     foo = '|'
  16.     for ix in range(0,x):
  17.       value = graf[iy][ix]
  18.       value3digit = ''
  19.       if value < 10:
  20.         value3digit = '  ' + str(value)
  21.       elif value < 100:
  22.         value3digit = ' ' + str(value)
  23.       else:
  24.         value3digit = '' + str(value)
  25.       foo = foo + value3digit + '|'
  26.     print(foo)
  27.     if iy != y-1:
  28.       foo = '|'
  29.       for i in range(0, x - 1):
  30.         foo = foo + '----'
  31.       print(foo + '---|')
  32.  
  33.   #bottom bar
  34.   foo = '\\'
  35.   for i in range(0, x-1):
  36.     foo = foo + '----'
  37.   print(foo + '---/')
  38.  
  39.  
  40. def czyIstniejąNieodwiedzone(x: int, y: int, odwiedzone):
  41.   for iy in range(0, y):
  42.     for ix in range(0, x):
  43.       if odwiedzone[iy][ix] == False:
  44.         return True
  45.   return False
  46.  
  47.  
  48. if __name__ == '__main__':
  49.   # wczytaj wymiary grafu
  50.   x = int(input())
  51.   y = int(input())
  52.  
  53.   # utwórz graf o podanych wymiarach, inicjalizując odległości 999
  54.   graf = [[999 for ix in range(x)] for iy in range(y)]
  55.   # ustaw odległość w startowym narożniku na 0
  56.   graf[0][0] = 0
  57.  
  58.   # rysuj graf
  59.   rysujGraf(x,y,graf)
  60.  
  61.   # utwórz tablicę przejść między komórkami grafu
  62.   tab = [[[0,0,0,0] for ix in range(x)] for iy in range(y)]
  63.  
  64.   # wczytaj wagi przejść (0 - brak przejścia)
  65.   for iy in range(0,y):
  66.     for ix in range(0,x):
  67.       for id in range(4):
  68.         tab[iy][ix][id] = int(input())
  69.  
  70.   print(tab)
  71.  
  72.   # Dijkstra
  73.  
  74.   # inicjalizacja
  75.   odwiedzone = [[False for ix in range(x)] for iy in range(y)]
  76.  
  77.   aktualnyX = 0
  78.   aktualnyY = 0
  79.  
  80.   # dopóki istnieją nieodwiedzone węzły powtarzamy:
  81.   while czyIstniejąNieodwiedzone(x, y, odwiedzone):
  82.     # ustaw nieodwiedzony węzeł z najniższą wartością jako aktualny
  83.     najnizsza = math.inf
  84.     for iy in range(0, y):
  85.       for ix in range(0, x):
  86.         if (odwiedzone[iy][ix] == False) and (graf[iy][ix] < najnizsza):
  87.           aktualnyX = ix
  88.           aktualnyY = iy
  89.           najnizsza = graf[iy][ix]
  90.  
  91.     # aktualizacja sąsiadów
  92.     for d in range(0,4):
  93.       r = tab[aktualnyY][aktualnyX][d]
  94.       if r > 0:
  95.         dystansNowy = graf[aktualnyY][aktualnyX] + r
  96.         if d == 0:
  97.           # do góry
  98.           dystansStary = graf[aktualnyY-1][aktualnyX]
  99.           if dystansNowy < dystansStary:
  100.             graf[aktualnyY-1][aktualnyX] = dystansNowy
  101.         if d == 1:
  102.           # w prawo
  103.           dystansStary = graf[aktualnyY][aktualnyX+1]
  104.           if dystansNowy < dystansStary:
  105.             graf[aktualnyY][aktualnyX+1] = dystansNowy
  106.         if d == 2:
  107.           # w dół
  108.           dystansStary = graf[aktualnyY+1][aktualnyX]
  109.           if dystansNowy < dystansStary:
  110.             graf[aktualnyY+1][aktualnyX] = dystansNowy
  111.         if d == 3:
  112.           # w lewo
  113.           dystansStary = graf[aktualnyY][aktualnyX-1]
  114.           if dystansNowy < dystansStary:
  115.             graf[aktualnyY][aktualnyX-1] = dystansNowy
  116.  
  117.     # zaznaczenie aktualnego węzła jako odwiedzonego
  118.     odwiedzone[aktualnyY][aktualnyX] = True
  119.  
  120.     rysujGraf(x, y, graf)
  121.     time.sleep(1)
  122.  
Advertisement
Add Comment
Please, Sign In to add comment