knightL

BFS (Classess)

Nov 19th, 2020 (edited)
383
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.35 KB | None | 0 0
  1. n = int ( input() )
  2. a = [ None ] * n
  3. # Читаем матрицу смежности
  4. for i in range(n):
  5.     a[i] = list( map(int, input().split() ) )
  6. u,v = map(int, input().split() )
  7. # Уменьшаем индексы, чтобы работать с номерами [0,n-1]
  8. u -= 1
  9. v -= 1
  10.  
  11. #Очередь и функции для работы с ней
  12. class Queue:
  13.     def __init__(self, n):
  14.         self.q = [0] * n
  15.         self.l = 0 # Первый элемент очереди
  16.         self.r = 0 # Номер элемента после последнего
  17.  
  18.     def push(self, x):
  19.         self.q[self.r] = x
  20.         self.r+=1
  21.    
  22.     def pop(self):
  23.         res = self.q[self.l]
  24.         self.l+=1
  25.         return res
  26.  
  27.     def isEmpty(self):
  28.         return self.l>=self.r
  29.        
  30. q = Queue(n)
  31.  
  32. # Массив, в котором отмечаем вершины, которые были в очереди
  33. used = [False] * n
  34. # Массив, в котором сохраняем расстояние до вершин
  35. d = [ -1 ] *n
  36.  
  37. q.push(u)
  38. used[u] = True
  39. d[u] = 0
  40.  
  41. while not q.isEmpty():
  42.     c = q.pop()
  43.  
  44.     #перебираем соседей
  45.     for i in range(n):
  46.         # Если есть ребро и вершину ещё не обработали
  47.         if a[c][i] == 1 and not used[i]:
  48.             #Добавляем в очередь вершину i
  49.             q.push(i)
  50.             used[i] = True
  51.             d[i] = d[c] + 1
  52.  
  53. print(d[v])
  54.  
Add Comment
Please, Sign In to add comment