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

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

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

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


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