Блог пользователя consoleapplication1

Автор consoleapplication1, 12 лет назад, По-русски

Добрый день, есть задача. Дан неориентированный невзвешенный граф, состоящий из N<50 вершин и M<100 ребер. К вершин (K<=N) имеют некую метку, нужно соединить эти К вершин минимальным количеством ребер (то есть некое подобие остова). Есть ли что-то лучше перебора? Задача из реального мира, интересует точное решение

upd нужно выбрать путь по существующим ребрам, новые проводить нельзя

  • Проголосовать: нравится
  • +6
  • Проголосовать: не нравится

»
12 лет назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

А что отличает от остова?

Удаляем ненужные вершины -> строим MST -> Profit!

  • »
    »
    12 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Возможно, то, что если удалить ненужные вершины, граф может оказаться несвязным?..

    • »
      »
      »
      12 лет назад, # ^ |
      Rev. 6   Проголосовать: нравится 0 Проголосовать: не нравится

      Удалить вершины,но ребра оставить(соединить все смежные вершины, если они не соединены ребром меньшего веса), т.е. был граф(матрица смежности):

      . 1 2 3
      1 0 0 1
      2 0 0 1
      3 1 1 0

      Нам не нужна вершина 3. Получаем матрицу смежности

      . 1 2
      1 0 2
      2 2 0

      Если граф был несвязным — ответа не существует.

      • »
        »
        »
        »
        12 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится

        Может кто-нибудь расскажет, где такое не работает?

        • »
          »
          »
          »
          »
          12 лет назад, # ^ |
            Проголосовать: нравится +4 Проголосовать: не нравится

          Непонятна фраза "рёбра оставить" (даже с учётом скобок после). Но, полагаю, вот такой тест завалит любое решение, которое выкидывает вершины:

          1. 11 вершин, 10 ребёр вида для 2 ≤ x ≤ 11.
          2. Все рёбра единичного веса.
          3. Надо найти поддерево, содержащее вершины с номерами с 2 по 6.
          4. Правильный ответ очевиден и равен 5.
        • »
          »
          »
          »
          »
          12 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится

          Еще пример два пути разной длины, допустим длины более 5 вершин, не пересекающихся по вершинам, и соединяющих вершины 1 и 2, между которыми и нужно найти "остов"

»
12 лет назад, # |
Rev. 2   Проголосовать: нравится +17 Проголосовать: не нравится

Это задача Штейнера на графе.
Для взвешенного случая NP-полная.
http://rain.ifmo.ru/cat/data/theory/unsorted/steiner-problem-2010/article.pdf
Для невзвешенного — непонятно NP или нет, я в доказательство не вникал...

»
12 лет назад, # |
Rev. 2   Проголосовать: нравится +14 Проголосовать: не нравится

Есть два решения:

  • динамика: dpv, mask — минимальное количество ребер в компоненте, содержащей вершину v исходного графа и подмножество mask выделенных вершин. Она считается за O(M2K) обходом в ширину для каждого mask.

  • перебор подмножества невыделенных вершин и проверка связности объединения его с множеством выделенных. Это O(2N - KM).

Если взять для данных N, M, K наиболее быстрое из них, получим сложность O(M2N / 2), что должно сработать в пределах минуты. Второе решение наверняка можно неасимптотически соптимизировать, чтобы было еще быстрее.

Хотя вообще-то это известная задача Штейнера, как уже отметили выше.