![]() |
|
|
![]()
|
|
| i... |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 6.5.2003 Репутация: нет Всего: нет |
Две задачки с графами решил, а эту... Помогите, пожалуйста, кто чем может.
Мостом графа назовем такое ребро, удаление которого увеличивает число компонент связности графа. Найти: все мосты заданного графа. |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: нет Всего: 538 |
Если задача чисто теоретическая то можно так:
Возьмем любую пару точек A и B, и построим все возможные пути, без циклов из A в B. Если некое ребро будет входить в все пути, то это мост. Перебрав все возможные пары A и B, найдем все мосты. Для практического применения этот алгоритм не оптимален. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| 3,14 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1614 Регистрация: 18.6.2004 Где: Н. Новгород Репутация: нет Всего: 24 |
Это вариант для связанного графа:
Перебираем все возможные разбиения мн-ва вершин графа на два различных мн-ва: 1) Если для какого-то разбиения найдено два различных ребра из одного мн-ва в другое - пееходим к следующему разбиению 2) Если такое ребро только одно, то оно и будет мостом Для несвязанного графа - разбиваем его на компоненты связанности, и к каждой из них применяем этот алгоритм Вообще у моста есть замечательное св-во - оно не содержится не в одном цикле, может кому удасться им воспользоваться, я, увы, не смог -------------------- Может быть, это только мой бред, Может быть, жизнь не так хороша, Может быть, я не выйду на свет, Но я летал, когда пела душа... |
|||
|
||||
| GePo |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 166 Регистрация: 30.3.2003 Где: Москва Репутация: нет Всего: 3 |
Вроде этот алгоритм есть в книге Липского. Решается поиском в глубину.
При очередном шаге будем увеличивать текущее время и присваивать его вершине. После всех вызовов из данной вершины запишем минимальное время вершины, которую мы смогли лостигнуть из данной. Если оно равно времени нашей вершины, то ребро из данной вершины и предка в дереве поиска в глубину и есть мост. Это сообщение отредактировал(а) GePo - 6.10.2004, 22:37 --------------------
|
|||
|
||||
| 3,14 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1614 Регистрация: 18.6.2004 Где: Н. Новгород Репутация: нет Всего: 24 |
Если ты имеешь ввиду книгу: "Комбинаторика для программистов", то в ней я этого алгоритма не нашёл, но может просто прогладел, вот ссылка на оную книгу : ftp://www.scientific-library.net/pub/data...ve/lipskii.djvu -------------------- Может быть, это только мой бред, Может быть, жизнь не так хороша, Может быть, я не выйду на свет, Но я летал, когда пела душа... |
|||
|
||||
| GePo |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 166 Регистрация: 30.3.2003 Где: Москва Репутация: нет Всего: 3 |
Начинаешь читать Липского со страницы 95, раздел 2.6 и читаешьесь раздел. Понимаешь, как находять точки сочленения, а мосты - читаешь, что я написал - будет понятно потом
--------------------
|
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 33 Всего: 110 |
подумал я тут недавно над этой задачкой, вроде нашел один не очень долгий способ, в котором используется то, что мост не входит ни в один цикл, только вместо цикла я рассматриваю два различных пути, соединяющих две точки
для начала: 0. выберем одну вершину (от фонаря) 1. припишем каждой вершине свойство - расстояние до выбранной точки (будем заполнять постепенно, сначала у выбранной точки 0, у остальных (-1)) и номер вершины, откуда в эту приходит минимальный путь 2. припишем каждому ребру свойство - пройдено/не пройдено (сначала все будут "не пройдены"), и "является/нет составной частью какого-нибудь цикла (сначала у всех будет "не является") --- далее будем действовать по такому алгоритму: 1. смотрим на точки, до которых мы добрались на предыдущем шаге (сначала это будет одна выбранная точка) 2. смотрим на все ребра эти точек, которые мы еще не проходили 3. смотрим на точки на концах этих ребер 4. далее есть два варианта: 4.1. точка еще не обрабатывалась (расстояние равно -1), тут все просто даем ей расстояние n+1 4.2. точка уже проходилась - значит, мы обнаружили цикл, надо его пометить, помечаем таким образом: идем по двум путям (минимальному и только что найденному) до точки их раздвоения и помечаем их ребра "входящими в цикл" 5. повторяем все, пока не обработаем все вершины 6. те ребра, которые не помечены как "входящие в цикл" и есть мосты честно говоря, не проверял его на сложных примерах, а так - вроде бы работает плюс этого алгоритма в том, что за один проход обнаруживаются все мосты в графе... -------------------- qqq |
|||
|
||||
![]()
|
| Правила форума "Алгоритмы" | |
|
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Алгоритмы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |