![]() |
|
|
![]()
|
|
| Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
У меня есть матрица смежности орграфа. Как определить связанный или нет?
|
|||
|
||||
| comp |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 61 Регистрация: 15.11.2006 Репутация: 1 Всего: 1 |
1.обходиш граф.
2.смотриш, все ли вершины помеченны. |
|||
|
||||
| Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
|
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 33 Всего: 110 |
ну тогда можно рассмотреть такую операцию:
берём вектор, в котором будем хранить, до каких вершин уже добрались под умножением матрицы будем понимать вектор, показывающий до каких вершин можно добраться если иметь возможность делать один шаг по рёбрам (будем считать, что по главной диагонали матрицы стоят 1) тогда получается, что каждый элемент нового вектора: Y[n]=OR[i=1..N] ( X[i] and M[n,i] ) эта операция задаёт "умножение" матрицы на вектор - Y=M*X большинство нужных свойств выводятся из ассоциативности, дистрибутивности и коммутативности операций or/and аналогично операциям +/* так что берём вектор с одной 1-цей, действуем на него N раз матрицей M и проверяем в нём наличие нулей, если есть - значит, это изолированные вершины (от первой), если нет - весь граф связный P.S. подозреваю, можно перевести это всё просто на умножение матриц потом посмотреть, что это просто возведение в N-ю степень в том виде, в котором оно представлено выше - количество умножений N но само по себе возведение в степень можно сделать за log N шагов: (в качестве иллюстрации)
-------------------- qqq |
|||
|
||||
| Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
Ок!
|
|||
|
||||
| FireSnake |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 201 Регистрация: 15.9.2006 Где: Украина, Донецк Репутация: нет Всего: 1 |
Граждане! А вам знакомы такие алгоритмы как обход в ширину и глубину?!! Выкладываю вам текст из Окулова:
3.2.2. Поиск в ширину Идея метода. Суть (в сжатой формулировке) заключается в том, чтобы рассмотреть все вершины, связанные с текущей. Принцип выбора следующей вершины - выбирается та, которая была раньше рассмотрена. Для реализации данного принципа необходима структура данных “очередь”. Пример. Исходный граф на левом рисунке. На правом рисунке рядом с вершинами в скобках указана очередность просмотра вершин графа. Приведем процедуру реализации данного метода обхода вершин графа. Логика просмотра вершин.
А вот сам алгоритм, который определяет связан граф или нет обходом в ширину:
Это сообщение отредактировал(а) maxim1000 - 12.12.2006, 01:12 |
||||
|
|||||
| Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
Построение ПВГ для каждой вершины?
|
|||
|
||||
| XbiT |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 65 Регистрация: 9.2.2006 Репутация: 1 Всего: 1 |
Не проще это точно. dfs легче для понимания имхо. рекурсия в пару строчек выходит. Единственное, может умножением быстрее...
|
|||
|
||||
| esperant0 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 714 Регистрация: 20.5.2005 Репутация: 4 Всего: 14 |
ДФС, не катит в данном случае. Самый простой алгоритм - это случайное блуждание по графу. Но он работает хорошо только неа не направленных графах -------------------- Student->Teacher Assistant ->Research assistant->Microsoft Software Development Engineer Пользователь получил наказание за то, что проигнорировал замечание которое было написано модератором а затем стерто и которое он - пользователь не мог видеть. |
|||
|
||||
| comp |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 61 Регистрация: 15.11.2006 Репутация: 1 Всего: 1 |
Ну блин, для орграфов, вообще-то, существует совершенной другой алгоритм для определения компонент сильной связности. И вопрос ветки, совершенно этого не касался. Да, и в глубь, намнооого медленнее, в любом случае, надо идти в ширь!!! |
|||
|
||||
| Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
Странно, а у меня в ширь сложнее получился чем в глубь
|
|||
|
||||
| comp |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 61 Регистрация: 15.11.2006 Репутация: 1 Всего: 1 |
Хех... не может быть. Если идти в глубь, то теряется много времени при возврате из рекурсии, чего собственно не наблюдается, если идти в ширину.
|
|||
|
||||
| Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
Ну да? В шируну тоже есть возврат из рекурсии
А можно ещё про перемножение матриц? N раз перемножить раз. А дальше что? |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 33 Всего: 110 |
если не ошибаюсь, то вполне достаточно проверить, что в каком-нибудь столбце все элементы- единицы (если граф неориентированный) -------------------- qqq |
|||
|
||||
| esperant0 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 714 Регистрация: 20.5.2005 Репутация: 4 Всего: 14 |
И все же самый простой алг, это случайный обход
-------------------- Student->Teacher Assistant ->Research assistant->Microsoft Software Development Engineer Пользователь получил наказание за то, что проигнорировал замечание которое было написано модератором а затем стерто и которое он - пользователь не мог видеть. |
|||
|
||||
![]()
|
| Правила форума "Алгоритмы" | |
|
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Алгоритмы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |