Нужно найти кратчайшее расстояние в ребрах графа согласно мнемоническому алгоритму: Мнемонический алгоритм: Из
V-й строки матрицы смежности получим вектор R, в котором, согласно утверждению (Все известные потомки первого уровня для вершины V перечислены в V-й строке матрицы смежности.), указаны все потомки первого уровня (т.е., количество вершин) и который в конечном итоге станет результатом работы функции).
Для каждого из возможных уровней L, начиная со второго, выполняем следующую последовательность действий:
Для каждого элемента V1 вектора R, значение которого равно L-1:
Получаем список смежных вершин Adj. Для каждого элемента Adj:
Если это
а) не вершина V
б) не потомок более низкого уровня то, согласно утверждению 3 это потомок
уровня L.( Все вершины, смежные с потомком L-го уровня, не являющиеся вершиной V потомками более низкого уровня являются потомками (т.е., количество вершин)L+1)-го уровня) R[Adj] = L)
mnemonic_algorithm <- function(graph, start_node) {
# получаем матрицу смежности графа и количество вершин в графе
adj_matrix <- get.adjacency(graph)
n <- vcount(graph)

# инициализируем вектор расстояний и вектор потомков первого уровня для start_node
shortest_distances <- rep(Inf, n)
shortest_distances[start_node] <- 0
R <- adj_matrix[start_node, ]

# перебираем все возможные уровни L
for (L in 2:n) {
# перебираем все вершины вектора R, у которых значение равно L-1
V1 <- which(R == L-1)
for (v in V1) {
# получаем список смежных вершин для вершины v
Adj <- which(adj_matrix[v, ] == 1)
# проверяем каждую вершину из списка Adj на соответствие утверждению 3
for (w in Adj) {
if (w != start_node && R[w] < L-1) {
R[w] <- L
}
}
}
# обновляем вектор расстояний shortest_distances
shortest_distances[R == L] <- L-1

}

return(shortest_distances)
}

matrica<-matrix(rep(0,400), nrow=20,ncol=20)
for (i in 1:20) {
for (j in 1:20) {
if(i==j || i%%5==0 || j%%5==0){
matrica[i,j]=1
}
}
}
# создаем объект графа из матрицы смежности
g <- graph_from_adjacency_matrix(matrica, mode=“undirected”)

plot(g)
mnemonic_algorithm(g, 1) При этом значения вектора получаются 0 19 19 19 18 19 19 19 19 18 19 19 19 19 18 19 19 19 19 18, а должны быть 0 2 2 2 1 2 2 2 2 1 2 2 2 2 1 2 2 2 2 1. Возможно, проблема в том, что при обновлении вектора R вы изменяете значения, которые уже учитывались на предыдущих шагах алгоритма. Поэтому R увеличивается на каждом новом уровне L.

Чтобы исправить это, можно добавить внутренний цикл for, который будет обновлять только те значения вектора R, которые соответствуют текущему уровню L. Исправь код,пожалуйста