INF = float('inf') N = int(input()) W = [] for i in range(N): row = list(map(int, input().split())) W.append(row) for i in range(N): for j in range(N): if W[i][j] < 0: W[i][j] = INF #print(*W) active = [True]*N # все вершины не просмотрены R = W[0][:] # скопировать в R строку 0 весовой матрицы ''' R = W[0] - неверное копирование строки W[0] в массив R ! Так как в переменную R записываем ссылку на строку 0 матрицы W, и при любом изменении списка R нулевая строка матрицы W также будет изменяться! Добавление «[:]» создаёт срез этого списка «от начала до конца», и в переменную R записывается ссылка на новый объект, который будет независим от матрицы W. ''' P = [0]*N # только прямые маршруты из вершины 0 active[0] = False # вершина 0 просмотрена P[0] = -1 for i in range(N-1): # среди активных вершин ищем вершину с минимальным соответствующим # значением в списке R и проверяем, не лучше ли двигаться через неё # поиск новой рабочей вершины R[j] -> min minDist = INF for j in range(N): if active[j] and R[j] < minDist: minDist = R[j] kMin = j active[kMin] = False # проверка маршрутов через вершину kMin for j in range(N): if R[kMin] + W[kMin][j] < R[j]: R[j] = R[kMin] + W[kMin][j] P[j] = kMin print ("Весовая матрица графа: ") for i in range(N): for j in range(N): if W[i][j] == INF: print ( " *", end="" ) else: print ("%4d" %W[i][j], end="") print() print ( "\nВспомогательные массивы:") print( "R |", end="" ) for i in range(N): print ("%4d" %R[i], end="" ) print(); print( "P |", end="" ) for i in range(N): if P[i] < 0: print ( " *", end="" ); else: print ( "%4d" %P[i], end="" ) print(); print() print("Кратчайший маршрут из вершины 1 в вершину", N) i = N-1 while i >= 0: print ( i+1, end="" ) if i != 0: print ( " <= ", end="" ) i = P[i]