Добрый день, есть задача. Дан неориентированный невзвешенный граф, состоящий из N<50 вершин и M<100 ребер. К вершин (K<=N) имеют некую метку, нужно соединить эти К вершин минимальным количеством ребер (то есть некое подобие остова). Есть ли что-то лучше перебора? Задача из реального мира, интересует точное решение
upd нужно выбрать путь по существующим ребрам, новые проводить нельзя
А что отличает от остова?
Удаляем ненужные вершины -> строим MST -> Profit!
Возможно, то, что если удалить ненужные вершины, граф может оказаться несвязным?..
Удалить вершины,но ребра оставить(соединить все смежные вершины, если они не соединены ребром меньшего веса), т.е. был граф(матрица смежности):
. 1 2 3
1 0 0 1
2 0 0 1
3 1 1 0
Нам не нужна вершина 3. Получаем матрицу смежности
. 1 2
1 0 2
2 2 0
Если граф был несвязным — ответа не существует.
Может кто-нибудь расскажет, где такое не работает?
Непонятна фраза "рёбра оставить" (даже с учётом скобок после). Но, полагаю, вот такой тест завалит любое решение, которое выкидывает вершины:
Еще пример два пути разной длины, допустим длины более 5 вершин, не пересекающихся по вершинам, и соединяющих вершины 1 и 2, между которыми и нужно найти "остов"
Это задача Штейнера на графе.
Для взвешенного случая NP-полная.
http://rain.ifmo.ru/cat/data/theory/unsorted/steiner-problem-2010/article.pdf
Для невзвешенного — непонятно NP или нет, я в доказательство не вникал...
Есть два решения:
динамика: dpv, mask — минимальное количество ребер в компоненте, содержащей вершину v исходного графа и подмножество mask выделенных вершин. Она считается за O(M2K) обходом в ширину для каждого mask.
перебор подмножества невыделенных вершин и проверка связности объединения его с множеством выделенных. Это O(2N - KM).
Если взять для данных N, M, K наиболее быстрое из них, получим сложность O(M2N / 2), что должно сработать в пределах минуты. Второе решение наверняка можно неасимптотически соптимизировать, чтобы было еще быстрее.
Хотя вообще-то это известная задача Штейнера, как уже отметили выше.