Поиск в ширину

  1. from collections import deque
  2. graph = {
  3.     'A' : ['B', 'C', 'E'],
  4.     'B' : ['A', 'C', 'D'],
  5.     'C' : ['D'],
  6.     'D' : ['C'],
  7.     'E' : ['F', 'D'],
  8.     'F' : ['C']
  9. }
  10.  
  11. def bfs(g, start):
  12.     queue, enqueued = deque([(None, start)]), set([start])
  13.     while queue:
  14.         parent, n = queue.popleft()
  15.         yield parent, n
  16.         new = set(g[n]) - enqueued
  17.         enqueued |= new
  18.         queue.extend([(n, child) for child in new ])
  19.  
  20. def shortest_path(g, start, end):
  21.     paths = {None : []}
  22.     for parent, child in bfs(g, start):
  23.         paths[child] = paths[parent] + [child]
  24.         if child == end:
  25.             return paths[child]
  26.     return None        
  27.  
  28. >shortest_path(graph, "A", "D")
  29. ["A", "C", "D"]
Реализация алгоритма поиска короткого пути(алгоритм поиска в ширину) в графе(g) из вершины start в вершину stop. Граф предстовляет собой хэш где ключем являеться имя вершины, а значение массив вершин соеденные с ключем.

Реклама

Мы в соцсетях

tw tg yt gt