Для задания мне нужно создать Дерево Штейнера. Однако это не типичное дерево Штейнера, поскольку структура графа, которую мы должны использовать, не позволяет вставлять новые вершины. Скорее, тестовые примеры определяют структуру графа из N вершин и M ребер, при этом конкретно помечая X вершин как целевые узлы. Это узлы, которые мы должны охватывать при использовании некоторых, ни одной или всех непомеченных вершин в графе.
Мое решение этой проблемы
- Примените алгоритм Дейкстры, чтобы найти кратчайший путь между всеми целевыми вершинами.
- For each of the shortest paths 1:n
- Extract all current selected path vertices into a set
- Извлечь все оставшиеся вершины в набор
- For all vertices of the current selected path 1:m
- Execute Dijkstra to find shortest path between current vertex and other path's vertices
- Если это создает связующее дерево, сохраните путь и длину в очереди приоритетов, отсортированных по значению длины.
- Всплеск приоритетной очереди и обратный путь
Моя проблема заключается в том, что это исчерпывающий поиск, который использует начальное приложение Дейкстры для создания сокращенного набора возможных начальных и конечных вершин для более короткого пути, чем минимальное остовное дерево.
Есть ли эвристический или другой алгоритм, который может решить эту проблему?