![]() |
|
![]() ![]() ![]() |
|
Kud |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 30.4.2005 Где: Минск Репутация: нет Всего: нет |
Есть граф. ориентированный. Необходимо добавить минимальное количество ребер что бы из каждой вершины был доступ к каждой. Ну т.е. что бы матрица смежности была вся в единичках =) кроме главной диагонали.
Это сообщение отредактировал(а) Kud - 30.4.2005, 16:24 |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 33 Всего: 110 |
вроде бы подойдет такой алгоритм...
берем одну вершину, красим в зеленый цвет смотрим на все, связные с ней вершины - их тоже красим дальше берем любую непокрашенную вершину и добавляем ребро к ней соответственно красим все связные вершины и так, пока весь граф не будет покрашен -------------------- qqq |
|||
|
||||
Kud |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 30.4.2005 Где: Минск Репутация: нет Всего: нет |
Этот алгоритм не пройдет т.к. граф ориентированный. просто соеденить с любой это не правильно.
|
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 33 Всего: 110 |
упс... не заметил... -------------------- qqq |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 33 Всего: 110 |
ну один вариант есть:
просто выписываем все несоединенные пары вершин - кандидаты на добавление в список ребер пусть их M (в общем случае можно считать, что оно пропорционально n^2, где n - количество всех вершин) из них нужно выбрать минимальное подмножество, которое решает задачу перебор получается немаленький можно воспользоваться динамическим программированием, тогда сложность будет порядка M^2 (n^4) но что-то мне это не нравится... n^4 - как-то слишком... -------------------- qqq |
|||
|
||||
Kud |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 30.4.2005 Где: Минск Репутация: нет Всего: нет |
а можно поподробней с этого места? А то что-то посидел ... ничего в голову не пришло =( |
|||
|
||||
Kud |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 30.4.2005 Где: Минск Репутация: нет Всего: нет |
У нас (на локальномфоруме) предложили такое решение: по мойму оно правильное. =)
Стягиваем ССК в вершины. Теперь нужно сделать граф такой, чтобы из каждой вершины выходила и входила хотя бы одна дуга и при этом он был одной компонентой связности. Поэтому вначале проводим дуги от вершин, из которых ничего не выходит к вершинам, в которые ничего не входит из разных компонент связности. Если после этого у нас осталось K компонет связности, то добавляем K дуг, причем по возможности для каждой компоненты связности вводим дугу в вершину, в которую не входит ни одна дуга и выводим из вершин, из которых не выходит. Пусть теперь мы объединили все компоненты связности и у нас осталось a вершин, из которых не выходит дуг и b вершин, в которые не входят дуги. Тогда соединяем их попарно min{a, b} дугами, оставшиеся a + b - 2*min{a, b} вершин присоединяем к любым вершинам, т.е. в этом случае всего добавляем max{a ,b} дуг. by HeaDacHe |
|||
|
||||
poor_yorik |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 148 Регистрация: 12.1.2005 Где: Общаги г. Киева Репутация: 3 Всего: 8 |
Kud ты понимаешь, граф может и не иметь вершин, из которых только выходят или только входят дуги. Хотя он и не будет сильно связным. Идея у тебя хорошая, но я предлягаю ее чуть-чуть улучшить.
Вначале найди все компоненты сильной связности по такому типу. Формируешь для каждой вершины А поиском в глубину вершины два множества S и Q. Множество S будет содержать все вершины в которые можно попасть из А, а множество Q будет содержать все вершины, из которых можно будет попасть в А. Пересечением множеств S и Q и будет комонента сильной связности, которая содержит вершину А. Так находишь все компоненты связности. Далее строишь граф G таким образом. Вершины в нем обозначают компоненты связности графа, и если из одной компоненты связности можно попасть в другую, то значит в графе G будет дуга между вершинами, соответствующими данным компонентам связности. ![]() А уже в полученном графе G испробуй свой алгоритм. Скорее всего заработает. ![]() --------------------
Семь раз отмерь, один раз - откомпиль.... Семь раз отпей, один раз - отлей... Семь раз отъешь, один раз - не жадничай и другим дай... |
|||
|
||||
Прохожая |
|
|||
Unregistered |
Ребята, есть такой замечательный сайт - http://www.belsky.narod.ru/
там выложен курс лекций и по графам тоже, и алгоритмы есть. поищите, вдруг поможет ![]() искать в разделе МАТЕМАТИКА |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Алгоритмы" | |
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Алгоритмы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |