Shiyan12

Алгоритм Дейкстры

Dec 11th, 2019
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.59 KB | None | 0 0
  1. #coding: utf-8
  2.  
  3.  
  4. class Graph:
  5.     def loadfromfile(self, name):
  6.         '''
  7.     Метод, загружающий граф из файла.
  8.     '''
  9.         f = open(name, 'r')
  10.         l = [line.strip() for line in f]
  11.         self.n = int(l[0])
  12.         self.names = {}
  13.         self.invert_names = {}
  14.         for x in l[1].split(', '):
  15.             y = x.split(':')
  16.             self.names[y[1]] = int(y[0]) - 1
  17.             self.invert_names[int(y[0]) - 1] = y[1]
  18.         self.g = [0] * self.n
  19.         for i in range(self.n):
  20.             self.g[i] = list(map(int, l[i + 2].split(' ')))
  21.        
  22.     def dijkstra_shortest_path(self, u):
  23.         '''
  24.     Метод, реализующий алгоритм Дейкстры.
  25.        u - стартовая вершина.
  26.     Алгоритм возвращает список пометок для всех вершин.
  27.     '''
  28.         d = [float('inf')] * self.n
  29.         p = [0] * self.n
  30.         u = self.names[u]
  31.         d[u] = 0
  32.         u = [False] * self.n
  33.         for i in range(self.n):
  34.             v = -1
  35.             for j in range(self.n):
  36.                 if not u[j] and (v == -1 or d[j] < d[v]):
  37.                     v = j
  38.             if d[v] == float('inf'):
  39.                 break
  40.             u[v] = True
  41.             for j in range(self.n):
  42.                 if self.g[v][j] > 0 and d[v] + self.g[v][j] < d[j]:
  43.                     d[j] = d[v] + self.g[v][j]
  44.                     p[j] = v
  45.         self.d = d.copy()
  46.         return p
  47.            
  48.     def dijkstra_get_path(self, u, v, l):
  49.         '''
  50.        Метод, печатающий список вершин, входящих в кратчайший путь от вершины u к вершине v.
  51.        l - список пометок всех вершин.
  52.        После списка вершин выводится длина кратчайшего пути.
  53.        '''
  54.         p = l.copy()
  55.         path = []
  56.         s = self.names[u]
  57.         t = self.names[v]      
  58.         v = t
  59.         while v != s:
  60.             path.append(v)
  61.             v = l[v]
  62.         path.append(s)
  63.         path.reverse()
  64.         path = list(map(lambda x: self.invert_names[x], path))
  65.         print('->'.join(path), '(' + str(self.d[t]) + ')')
  66.        
  67. F = Graph()
  68. F.loadfromfile('1.txt')
  69. l = F.dijkstra_shortest_path('Pupkino')
  70. F.dijkstra_get_path('Pupkino', 'Kozulkino', l)
  71.  
  72. G = Graph()
  73. G.loadfromfile('2.txt')
  74. l = G.dijkstra_shortest_path('x1')
  75. G.dijkstra_get_path('x1', 'x2', l)
  76.  
  77. H = Graph()
  78. H.loadfromfile('3.txt')
  79. l = H.dijkstra_shortest_path('My')
  80. H.dijkstra_get_path('My', 'Highway', l)
Add Comment
Please, Sign In to add comment