2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки


Правила форума


В этом разделе нельзя создавать новые темы.



Начать новую тему Ответить на тему
 
 Задача о графах
Сообщение31.10.2010, 12:04 
Заслуженный участник


27/04/09
28128
Думаю о курсовой, в которой надо написать программу, решающую вот что:
Дан орграф с циклами (не говорилось, но, наверно, с орциклами). Надо узнать, есть ли в нём вершина, при удалении которой все циклы исчезнут.

Ничего особого о свойствах такой вершины я не придумал, поэтому решил просто найти все циклы и найти пересечение множеств их вершин. Если оно пустое, вершины такой, естественно, нет. Тогда нужно найти как-то все орциклы. Скажите, можно ли придумать что-то лучше перебора? При том раз это орграф, получается, для полноты нужно поперебирать, начиная с каждой вершины. Прав ли я?

 Профиль  
                  
 
 Re: Задача о графах
Сообщение31.10.2010, 12:42 


26/01/10
959
Так а в чем проблема? Берем ориентированный граф, у которого есть матрица смежности.
Удаляем по одной вершине и запускаем алгоритм Флойда-Уоршалла, который скажет нам, есть ли способ попасть из вершины в саму себя не более чем за $n$ шагов (где $n$ - число вершин в новом графе). Сложность данного подхода есть $O(n^4)$, всяко лучше, чем перебор.

 Профиль  
                  
 
 Re: Задача о графах
Сообщение31.10.2010, 13:51 
Заслуженный участник


27/04/09
28128
Тогда можно использовать поиск в глубину не для нахождения всех циклов, чтобы потом их пересекать, как я собирался, а для проверки на цикличность вместо Флойда — Уоршалла как здесь. Щас попробую понять сложность поиска в глубину. Мне почему-то кажется, что она меньше $O(n^3)$!
Ну да, и вроде вообще $O(n)$. Ага, нет, если граф не сильно связный, то придётся запускать поиск до $O(n)$ раз для всё ещё непосещённых вершин, к тому же, критерий цикла уже не работает. Да, в моём случае, наверно, ваш способ единственно возможный. :?

-- Вс окт 31, 2010 17:24:48 --

Не хочу трогать матрицу. Наверно, получится что-то типа этого:
Код:
for u in V   // этот цикл по убираемой вершине
    for k in V
        if k = u continue
        for i in V
            if i = u continue
            for j in V
                if j = u continue
                E[i, j] := E[i, j] || E[i, k] && E[k, j]
    Cyclic := false
    for i in V
        if E[i, i]
            Cyclic := true
            break
    if !Cyclic return true
return false

Ничего не упустил?

 Профиль  
                  
 
 Re: Задача о графах
Сообщение31.10.2010, 14:43 


26/01/10
959
Поиск в глубину работает за $O($число рёбер$)$. Это не всегда быстрее, чем Флойд, так как вы будете запускать поиск от каждой вершины.

То, что вы написали в коде - неправильно. Вместо

Код:
E[i, j] := E[i, j] || E[i, k] || E[k, j]


Должно быть хотя бы

Код:
E[i, j] := E[i, j] || E[i, k] && E[k, j]


А дальше не глядел... но там трудно вроде ошибиться.

 Профиль  
                  
 
 Re: Задача о графах
Сообщение31.10.2010, 14:46 
Заслуженный участник


27/04/09
28128
Zealint в сообщении #368293 писал(а):
Должно быть хотя бы <…>
:oops: Исправил.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Модераторы: Модераторы Математики, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group