Shiyan12

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

Dec 11th, 2019
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.83 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.     Алгоритм возвращает список пометок для всех вершин.
  26.     '''
  27.         d = [float('inf')] * self.n
  28.         p = [0] * self.n
  29.         u = self.names[u]
  30.         d[u] = 0
  31.         u = [False] * self.n
  32.         for i in range(self.n):
  33.             v = -1
  34.             for j in range(self.n):
  35.                 if not u[j] and (v == -1 or d[j] < d[v]):
  36.                     v = j
  37.             if d[v] == float('inf'):
  38.                 break
  39.             u[v] = True
  40.             for j in range(self.n):
  41.                 if self.g[v][j] > 0 and d[v] + self.g[v][j] < d[j]:
  42.                     d[j] = d[v] + self.g[v][j]
  43.                     p[j] = v
  44.         self.d = d.copy()
  45.         return p
  46.            
  47.     def dijkstra_get_path(self, u, v, l):
  48.         p = l.copy()
  49.         path = []
  50.         s = self.names[u]
  51.         t = self.names[v]      
  52.         v = t
  53.         while v != s:
  54.             path.append(v)
  55.             v = l[v]
  56.         path.append(s)
  57.         path.reverse()
  58.         path = list(map(lambda x: self.invert_names[x], path))
  59.         print('->'.join(path), '(' + str(self.d[t]) + ')')
Add Comment
Please, Sign In to add comment