@ukoHka
Всего понемногу

Как обойти все вершины графа кратчайшим путем?

Даны n точек на плоскости двумя неотрицательными координатами. Игроку нужно обойти их все. Какое минимальное расстояние нужно пройти, чтобы обойти все точки, если игрок всегда начинает с точки (0,0)?
Я знаю, что это задача на графы, знаю, что есть куча алгоритмов, алгоритм Дейкстры может помочь решить, возможно это гамильтонов граф и т.д. Но разобраться во всем этом не смог, поэтому интересует именно реализация.
Пока что имеется только: считал точки в массив, построил матрицу смежности, которая является симметричной, относительно главной диагонали, а дальше никак. В матрице смежности в a[i,j] записано расстояние между i-й и j-й точкой, включая и стартовую точку.
  • Вопрос задан
  • 1546 просмотров
Решения вопроса 1
longclaps
@longclaps
Это - задача коммивояжера, решается перебором.
Вот тебе решение на питоне, на паскале ты уж как-нибудь сам )
from math import hypot

# тестовые варианты наборов точек
points = [(3, 4), (7, 7)]
points = [(3, 0), (3, 4), (6, 4)]
points = [(1, 0), (1, 8), (0, 8)]

INF = 1e20  # будем считать, что это - бесконечность
def f(startx, starty):
    res = INF
    for i, (x, y) in enumerate(points):
        if x >= 0:
            points[i] = (-1, -1)  # подменяю использованую точку на фиктивную
            t = hypot(startx - x, starty - y) + f(x, y)  # вот рекурсия, как обещал
            if res > t:
                res = t
            points[i] = (x, y)  # восстанавливаю точку
    if res == INF:  # не нашлось ни одной неиспользованой точки
        res = 0
    return res

print(f(0, 0))  # стартую из начала координат
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы