Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Граф / 9 сообщений из 9, страница 1 из 1
15.10.2006, 14:05
    #34055636
GoST
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Граф
Может кто и поможет, не могу решить вот такую задачку.
Есть вот такой граф (см. рис.) и нужно узнать все пути его построений (например: A->B, B->A, A->C ну и тд), можно начать с любой вершины.
Подскажите пожалуйста решение. Заинтересовала меня задачка, но не решить не получается.
...
Рейтинг: 0 / 0
15.10.2006, 19:51
    #34055825
Dmitrii K.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Граф
Если я правильно понял, то нужно реализовать полный обход графа с бэктрэкингом, то есть пройтись по всем существующим рёбрам графа. Давненько такими задачками не занимался и что-то не припомню стандартного алгоритма, скорее всего точно такого и нет. Но можно модифицировать какой-нибудь из агоритмов обхода (в глубину/ширину) или придумать что-нибудь своё.
Общая идея такова: при переходе от одной вершины к другой помечаем соответствующее ребро как пройденное или убираем его из множества рёбер графа. При этом запоминаем пройденный путь и удалённые рёбра для возможности отката (backtracking). Цель достигнута (найден один из путей построения графа), когда множество непройденных рёбер будет пустым. Далее откатываемся на шаг назад, восстанавливаем удплённые дуги графа и пробуем найти другой путь и т.д. до окончания полного перебора вариантов. В завасимости от условий задачи, вероятно, нужно будет проделывать обход из каждой вершины т.к. при этом результирующие пути будут другими (смещёнными на какое-то количество шагов относительно ранее найденных).
Алгоритм, на первый взгляд, получается достаточно нетривиальным. Вероятно, есть и более простое и элегантное решение, но "умная мысля", как известно... Чтобы придумать (если надо), что-нибудь поэффективнее, надо немного повариться в ткого рода задачках, вспомнить студенчество :)

Если раньше на графах ничего не решали, то посоветовал бы для начала решить пару задач попроще, реализовать пару стандартных алгоритмов (примеров в сети достаточно, думаю), чтобы ознакомиться с используемыми подходами и структурами данных.
...
Рейтинг: 0 / 0
15.10.2006, 20:09
    #34055841
Dmitrii K.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Граф
Кстати, можно ещё посмотреть BGL (C++ Boost Graph Library)
http://www.rsdn.ru/res/book/cpp/bgl.xml
Может там что-то похожее реализовано.

Библиотека довольно обширная, на изучение может уйти немало времени, но если дальше придётся работать с графами, то польза будет. А если задача решается из чисто любопытского интереса, то быстрее будет своё решение наваять.
...
Рейтинг: 0 / 0
15.10.2006, 22:44
    #34055901
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Граф
gostи нужно узнать все пути его построений
Хм. Если иметь в виду стандартное для таких задач условие "не проходить по ребру больше одного раза", то ответом будет пустое множество.
...
Рейтинг: 0 / 0
16.10.2006, 06:45
    #34056008
GoST
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Граф
Dmitrii K. Спасибо за помошь, интересная идея алгоритма обязательно попробую реализовать.
...
Рейтинг: 0 / 0
16.10.2006, 06:51
    #34056014
GoST
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Граф
softwarer
Хм. Если иметь в виду стандартное для таких задач условие "не проходить по ребру больше одного раза", то ответом будет пустое множество.
Да, условие именно такое, но почему вы считаете что ответом будет пустое множество. Неужели вы просчитали все заранее вместо программы или же вы уже сталкивались с такой задачей? Объясните пожалуйста, потому что если при таком условии этот граф не возможно построить, тогда и нет смысла писать программу, т.к. нет решения.
...
Рейтинг: 0 / 0
16.10.2006, 10:51
    #34056390
Dmitrii K.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Граф
Александр прав насчёт ответа, для данного графа, действительно, решений нет. Если отбросить внешние дуги (поскольку по ним можно пройтись по кругу их любой вершины), то задача сводится к рисованию квадрата с диагоналями, у которой решения нет (в детстве не рисовали конверт, не отрывая карандаш от бумаги?).
Но если убрать любое из рёбер графа, то появится непустое множество решений и можно потренироваться в алгоритмике :)
...
Рейтинг: 0 / 0
16.10.2006, 12:53
    #34056842
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Граф
gostНеужели вы просчитали все заранее вместо программы
Нет, я предпочел потратить несколько секунд на размышления. Теорема: для того, чтобы граф можно было обойти указанным образом, необходимо, чтобы в нем было либо ноль либо две вершины с нечетным числом дуг. А у Вас таких вершин четыре.

Доказательство теоремы тривиально: в любом пути будут начальная вершина, конечная и множество промежуточных. Возьмем любую промежуточную: каждый раз, когда она встречается в пути, на это тратятся две дуги (по одной приходим, по другой уходим). Таким образом, если количество дуг нечетно, пройти по оставшейся последней дуге мы не сможем (мы придем в вершину без выхода, то есть она будет конечной, а не промежуточной).
...
Рейтинг: 0 / 0
16.10.2006, 21:56
    #34058656
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Граф
Это задача о кенигсбергских мостах, поиск Гамильтонова цикла (Hamiltonian circuit)
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Граф / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]