Поиск алгоритма решения задачи построения графа с заданными условиями

Тема в разделе "WASM.A&O", создана пользователем only, 5 янв 2009.

  1. only

    only New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2008
    Сообщения:
    147
    Собственно ищу какой-то стандартный алгоритм.
    С дискретной математикой не связан и потому надеюсь, что тут кто-то подскажет, т к мое решение точно не катит.

    Построение графа с заданным количеством вершин и заданным минимальным количеством рёбер, инцидентных каждой вершине.
     
  2. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    only
    Если задано для каждой вершины только минимальное количество рёбер, то что мешает сделать у каждой вершины по N-1 ребру? :)
     
  3. only

    only New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2008
    Сообщения:
    147
    maxdiver
    Шутить изволите? :)

    Ладно я уточню
    Нужно найти граф покрывающий все вершины
    каждая из вершин должна иметь определенное число инцидентных ребер >2 && <n-1
     
  4. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Что значит 'инцидентный'?
     
  5. only

    only New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2008
    Сообщения:
    147
    KeSqueer

    инцидентные ребра, в смысле - ребра связанные с вершиной.
    тут вот описано, более понятно - ->link<-
     
  6. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Из каждой вершины исходит одинаковое количество ребер? При чем здесь минимальное? Уточните еще, пожалуйста.
     
  7. scf

    scf Member

    Публикаций:
    0
    Регистрация:
    12 сен 2005
    Сообщения:
    386
    пусть мы имеем n вершин и нам нужно k вершин для каждого ребра
    1. выбираем две вершины, которые имеют наименьшее число ребер меньше k
    2. если таких вершин нет, то выход
    3. если такая вершина одна, то соединяем ее с произвольной вершиной
    4. если таких вершин две, то соединяем их
    5. перейти на 1

    Не скажу, что это самый быстродействующий алгоритм, но работать должен
     
  8. scf

    scf Member

    Публикаций:
    0
    Регистрация:
    12 сен 2005
    Сообщения:
    386
    Задачу можно переформулировать следующим образом: дана симметричная матрица n x n, состоящая из 0 и 1
    Найти такую матрицу, чтобы каждый ее столбец содержал ровно k единиц.
     
  9. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    scf
    Вполне неплохое решение. Следует только добавить проверку условия - не соединены ли уже эти две найденных вершины.
    Можно все вершины засунуть в список, первую соединить с последней. Потом по кругу прогонять к-2 раз:
    1 Взять следующую вершину
    2 найти первую вершину из следующих за ней в списке по циклу с ней еще не соединенную и соединить их
     
  10. only

    only New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2008
    Сообщения:
    147
    KeSqueer

    вобщем не всегда возможно соединить все вершины так чтобы количество ребер инцидентных каждой было одинаковым и было равно какому то определенному значению

    scf
    вобще я имел ввиду что на входе n вершин и k- минимальное количество ребер связанных с каждой вершиной
    изначально ребер связывающих какие-либо вершины нет, т е по алгоритму сразу выход
    и дале пусть даже изначально вершины связаны в кольцо выходит по алгоритму к соседним(уже связанным вершинам) будет добавлятся еще одно ребро, а так увы нельзя

    Видать обьяснение туманное слишком
     
  11. only

    only New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2008
    Сообщения:
    147
    вот например

    n = 10
    k = 2

    [​IMG]

    n = 10
    k = 3
    [​IMG]

    n = 10
    k = 4
    [​IMG]
     
  12. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Чем #9 не подходит? Старался сделать именно так.
     
  13. only

    only New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2008
    Сообщения:
    147
    для нечетного количества вершин

    n = 7
    k = 2
    [​IMG]

    n = 7
    k = 3
    [​IMG]
    вот тут видно что 7 вершина имеет 4 инцидентных ребра
    но минимум по всему графу - 3 ребра

    n = 7
    k = 4
    [​IMG]
     
  14. only

    only New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2008
    Сообщения:
    147
    сори пропустил комент
    сейчас покажу почему не подходит
     
  15. only

    only New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2008
    Сообщения:
    147
    KeSqueer

    Хотя нет
    перепроверил и все верно
    твой способ на каждом проходе кроме последнего дает
    четное количество ребер инцидентных вершине
    2-4-6 и тд до n-1 включительно
    спасибо за помощь :)
     
  16. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    А вот на таком тесте как будет работать: n=6, k=3?
    Если я правильно понял ваш алгоритм, то он соединит:
    1-2, 2-3, 3-4, 4-5, 5-6, 6-1, затем 1-3, 2-4, затем у него останутся вершины 5 и 6 с недостающим 1 ребром, но их соединить он не сможет, и ему придётся сделать 2 ребра (например, 5-1 и 6-2, неважно), т.е. на 1 ребро больше оптимума.

    Оптимум: 1-2, 2-3, 3-4, 4-5, 5-6, 6-1, и затем 1-3, 4-6, 2-5.

    Если я нигде не ошибся, получается, алгоритм неоптимальный у вас...
     
  17. only

    only New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2008
    Сообщения:
    147
    maxdiver
    в том способе имелось в виду следующее

    1 проход - кольцо

    а второй

    1-3
    2-4
    3-5
    4-6
    5-1
    6-2

    на каждом проходе добавляется по 2 инцидентных ребра, что я в принципе и написал
     
  18. only

    only New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2008
    Сообщения:
    147
    -del-
     
  19. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    only, зачем добавлять всегда по 2, если k нечётно? Он же вообще по 4 ребра добавит вместо 3.
    Вот последний проход и интересует
     
  20. only

    only New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2008
    Сообщения:
    147
    имел в виду, что на последнем проходе добавится максимум по 1 ребру,
    но это в общем выходит топология - полносвязный граф, которая меня не совсем устраивает, как и кольцо, например.

    Нечетное количество инцидентных каждой вершине ребер, как мне кажется, найти не всегда возможно, если например вершин нечетное количество.
    А вот с четным проблем нет.
    И алгоритм очень простой.
    Если видишь другое решение - подскажи.