Проблема с алгоритмом Дейкстры
При вводе матрицы
0, 9, 2, 0, 6,
9, 0, 3, 0, 0,
2, 3, 0, 5, 0,
0, 0, 5, 0, 3,
6, 0, 0, 1, 0,
и значения (отвечает за вершину с которой будет искаться минимальное расстояние):
D
Выдает не правильный ответ:
7 Infinity 5 0 1
Хотя должно получиться
7 8 5 0 1
Или даже так
0 2 4 0 6
2 0 1 0 0
4 1 0 5 1
0 0 5 0 3
6 0 1 3 0
E
Выводит в общем это 6 1 3 0
Как исправить код чтобы работало?
const readline = require('readline')
const rl = readline.createInterface({input: process.stdin, output: process.stdout})
let arr = []
let arrChars = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J']
rl.question('Matrix length: ', async (userInput) => { // первый вызов програмы для того чтобы задать размер матрицы
const arrayLength = await userInput[0]
const arrayWidth = await userInput[0]
matrix(arrayLength, arrayWidth)
})
const matrix = (arrayLength , arrayWidth) => {
if(arrayLength === 0){ // если длина массива становиться 0, то производит вызов функции отвечающей за расчет данных
rl.question('Search way: ', async (userInput) => { // первый вызов програмы для того чтобы задать размер матрицы
let variable = await userInput[0]
let number
arrChars.filter( (char, i) => {
if(variable.toLocaleLowerCase() === char.toLocaleLowerCase()){ // делаем сразу ловеркейс, чтобы при проверке не выдавало ошибку если пользователь ввел вместо большой буквы, маленькую
number = i
}
})
console.log(number)
degree(number)
})
}
if(arrayLength > 0){ // производит запись пока значение длины массива больше 0
rl.question(`Row: ${arrayLength}, enter numbers separated by spaces: `, async (userInput) => {
const subArray = await userInput.split(' ') // делает из строки массив
for(let i = 0; i < subArray.length; i++) {
subArray[i] = Number(subArray[i])
}
subArray.length = arrayWidth
await arr.push(subArray) // добавляет в основной массив подмассив выведенный из строки
matrix(arrayLength - 1, arrayWidth) // производит вызов функции записи с длиной массива - 1
})
}
}
const degree = (variable) => {
let allPathLength = []
for(let i = 0; i < arr.length; i++){ // заменяем 0 на максимальное число
for(let j = 0; j < arr.length; j++){
if(i == j){
arr[i][j] = 0
j++
}
if(arr[i][j] == 0){
arr[i][j] = Infinity
}
}
}
for(let i = 0; i < arr.length; i++){ // создаем матрицу для записи элементов в массив
allPathLength.push(Infinity)
}
allPathLength[variable] = 0
for(let i = 0; i < arr.length; i++) {
if(allPathLength[i] < Infinity) {
for(let j = 0; j < arr.length; j++) {
if(arr[i][j] + allPathLength[i] < allPathLength[j]) {
allPathLength[j] = arr[i][j] + allPathLength[i]
}
}
}
}
console.log(arr)
arrChars.length = arr.length
console.log(...arrChars)
console.log(...allPathLength)
}