|
|
|
Граф
|
|||
|---|---|---|---|
|
#18+
Может кто и поможет, не могу решить вот такую задачку. Есть вот такой граф (см. рис.) и нужно узнать все пути его построений (например: A->B, B->A, A->C ну и тд), можно начать с любой вершины. Подскажите пожалуйста решение. Заинтересовала меня задачка, но не решить не получается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2006, 14:05 |
|
||
|
Граф
|
|||
|---|---|---|---|
|
#18+
Если я правильно понял, то нужно реализовать полный обход графа с бэктрэкингом, то есть пройтись по всем существующим рёбрам графа. Давненько такими задачками не занимался и что-то не припомню стандартного алгоритма, скорее всего точно такого и нет. Но можно модифицировать какой-нибудь из агоритмов обхода (в глубину/ширину) или придумать что-нибудь своё. Общая идея такова: при переходе от одной вершины к другой помечаем соответствующее ребро как пройденное или убираем его из множества рёбер графа. При этом запоминаем пройденный путь и удалённые рёбра для возможности отката (backtracking). Цель достигнута (найден один из путей построения графа), когда множество непройденных рёбер будет пустым. Далее откатываемся на шаг назад, восстанавливаем удплённые дуги графа и пробуем найти другой путь и т.д. до окончания полного перебора вариантов. В завасимости от условий задачи, вероятно, нужно будет проделывать обход из каждой вершины т.к. при этом результирующие пути будут другими (смещёнными на какое-то количество шагов относительно ранее найденных). Алгоритм, на первый взгляд, получается достаточно нетривиальным. Вероятно, есть и более простое и элегантное решение, но "умная мысля", как известно... Чтобы придумать (если надо), что-нибудь поэффективнее, надо немного повариться в ткого рода задачках, вспомнить студенчество :) Если раньше на графах ничего не решали, то посоветовал бы для начала решить пару задач попроще, реализовать пару стандартных алгоритмов (примеров в сети достаточно, думаю), чтобы ознакомиться с используемыми подходами и структурами данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2006, 19:51 |
|
||
|
Граф
|
|||
|---|---|---|---|
|
#18+
Кстати, можно ещё посмотреть BGL (C++ Boost Graph Library) http://www.rsdn.ru/res/book/cpp/bgl.xml Может там что-то похожее реализовано. Библиотека довольно обширная, на изучение может уйти немало времени, но если дальше придётся работать с графами, то польза будет. А если задача решается из чисто любопытского интереса, то быстрее будет своё решение наваять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2006, 20:09 |
|
||
|
Граф
|
|||
|---|---|---|---|
|
#18+
gostи нужно узнать все пути его построений Хм. Если иметь в виду стандартное для таких задач условие "не проходить по ребру больше одного раза", то ответом будет пустое множество. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2006, 22:44 |
|
||
|
Граф
|
|||
|---|---|---|---|
|
#18+
Dmitrii K. Спасибо за помошь, интересная идея алгоритма обязательно попробую реализовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2006, 06:45 |
|
||
|
Граф
|
|||
|---|---|---|---|
|
#18+
softwarer Хм. Если иметь в виду стандартное для таких задач условие "не проходить по ребру больше одного раза", то ответом будет пустое множество. Да, условие именно такое, но почему вы считаете что ответом будет пустое множество. Неужели вы просчитали все заранее вместо программы или же вы уже сталкивались с такой задачей? Объясните пожалуйста, потому что если при таком условии этот граф не возможно построить, тогда и нет смысла писать программу, т.к. нет решения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2006, 06:51 |
|
||
|
Граф
|
|||
|---|---|---|---|
|
#18+
Александр прав насчёт ответа, для данного графа, действительно, решений нет. Если отбросить внешние дуги (поскольку по ним можно пройтись по кругу их любой вершины), то задача сводится к рисованию квадрата с диагоналями, у которой решения нет (в детстве не рисовали конверт, не отрывая карандаш от бумаги?). Но если убрать любое из рёбер графа, то появится непустое множество решений и можно потренироваться в алгоритмике :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2006, 10:51 |
|
||
|
Граф
|
|||
|---|---|---|---|
|
#18+
gostНеужели вы просчитали все заранее вместо программы Нет, я предпочел потратить несколько секунд на размышления. Теорема: для того, чтобы граф можно было обойти указанным образом, необходимо, чтобы в нем было либо ноль либо две вершины с нечетным числом дуг. А у Вас таких вершин четыре. Доказательство теоремы тривиально: в любом пути будут начальная вершина, конечная и множество промежуточных. Возьмем любую промежуточную: каждый раз, когда она встречается в пути, на это тратятся две дуги (по одной приходим, по другой уходим). Таким образом, если количество дуг нечетно, пройти по оставшейся последней дуге мы не сможем (мы придем в вершину без выхода, то есть она будет конечной, а не промежуточной). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2006, 12:53 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=34056842&tid=2030274]: |
0ms |
get settings: |
9ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
295ms |
get topic data: |
14ms |
get forum data: |
4ms |
get page messages: |
65ms |
get tp. blocked users: |
2ms |
| others: | 245ms |
| total: | 662ms |

| 0 / 0 |
