Возможно, вы могли бы немного улучшить, поддерживая отдельный открытый и закрытый список (посещенный и не посещенный), это может немного улучшить время поиска.
В настоящее время вы ищете не посещенный узел с наименьшим расстоянием до источника.
1) Вы можете поддерживать отдельный «открытый» список, который будет становиться все меньше и меньше по мере итерации и, таким образом, постепенно уменьшать пространство поиска.
2) Если вы поддерживаете «закрытый» список (те узлы, которые вы посетили), вы можете сравнить расстояние только с этими узлами. Это постепенно увеличивает пространство поиска, но вам не нужно проверять все узлы на каждой итерации. Проверка расстояния по узлам, которые еще не были посещены, не имеет смысла.
Также: возможно, рассмотрите следующий график при выборе следующего узла для оценки: в «закрытом» списке вы можете найти наименьшее расстояние и затем найти «открытый» узел среди его соединений. (если узел не имеет открытых узлов в своих соединениях, вы можете удалить его из закрытого списка; тупик).
Вы даже можете использовать это подключение для формирования своего открытого списка, это также поможет с островами (ваш код в настоящее время будет аварийно завершать работу, если на графике есть острова).
Вы также можете предварительно построить более эффективный граф соединений вместо перекрестной таблицы, содержащей все возможные комбинации узлов (например, структуру Node со списком узлов соседей []). Это избавило бы от необходимости проверять все узлы для каждого узла в массиве dist [] []
Вместо того, чтобы инициализировать все расстояния узлов до бесконечности, вы можете инициализировать их на «минимально возможном оптимистическом расстоянии» до цели и отдавать предпочтение обработке узлов на основе этого (ваши возможности здесь различаются, если узлы находятся на 2D-плоскости, которую вы могли бы использовать птица-расстояние). См. A * описания эвристики. Однажды я реализовал это вокруг очереди, не совсем уверенный, как бы интегрировать это в этот код (без очереди).