Чтение онлайн

на главную - закладки

Жанры

Программирование на языке Ruby
Шрифт:

Не будем объяснять принцип работы алгоритма, интересующийся читатель может найти описание в любой книге по дискретной математике. Но в листинге 9.4 приведена его реализация на Ruby.

Листинг 9.4. Выяснение того, является ли граф связным

class Graph

 def connected?

x = vmax

k = [x]

l = [x]

for i in 0..@max

l << i if self[x,i]==l

end

while !k.empty?

y = k.shift

#
Теперь ищем все ребра (y,z).

self.each_edge do |a,b|

if a==y || b==y

z = a==y ? b : a

if !l.include? z

l << z

k << z

end

end

end

end

if l.size < @max

false

else

true

end

 end

end

mygraph = Graph.new([0,1], [1,2], [2,3], [3,0], [1,3])

puts mygraph.connected? # true

puts mygraph.euler_path? # true

mygraph.remove 1,2

mygraph.remove 0,3

mygraph.remove 1,3

puts mygraph.connected? # false

puts mygraph.euler_path? # false

В примере упомянут метод

euler_path?
, с которым мы еще не встречались. Он определен в разделе 9.4.4.

Можно было бы усовершенствовать этот алгоритм, так чтобы он находил все связные компоненты несвязного графа. Но мы не станем этого делать.

9.4.3. Есть ли в графе эйлеров цикл?

Нет такой отрасли математики, сколь угодно абстрактной, которая со временем не нашла бы применения в реальной жизни.

Николай Лобачевский

Иногда нужно знать, есть ли в графе эйлеров цикл. Термин связан с математиком Леонардом Эйлером, который основал область топологии, занимающуюся этим вопросом. (Графы, обладающие таким свойством, называют иногда уникурсивными, поскольку их можно нарисовать не отрывая карандаша от бумаги и не проходя дважды по одному и тому же ребру.)

В немецком городе Кенигсберг был остров посередине реки. С двумя берегами остров связывало семь мостов. Горожане

хотели знать, можно ли обойти город так, чтобы побывать на каждом мосту ровно один раз и вернуться в исходную точку. В 1735 году Эйлер доказал, что это невозможно. Эта классическая задача стала первой проблемой теории графов.

Как часто бывает в жизни, решение кажется простым, когда оно найдено. Оказалось, что для существования в графе эйлерова цикла необходимо и достаточно, чтобы все вершины имели четную степень. Вот короткий код, проверяющий выполнение этого свойства:

class Graph

 def euler_circuit?

return false if !connected?

for i in 0..@max

return false if degreed) % 2 != 0

end

true

 end

end

mygraph = Graph.new([1,0],[0,3],[2,1],[3,1],[3,2])

flag1 = mygraph.euler_circuit? # false

mygraph.remove 1,3

flag2 = mygraph.euler_circuit? # true

9.4.4. Есть ли в графе эйлеров путь?

Эйлеров путь и эйлеров цикл — разные вещи. Слово «цикл» подразумевает, что нужно вернуться в исходную точку. А наличие пути предполагает, что нужно лишь посетить каждую вершину ровно один раз. В следующем фрагменте демонстрируется это различие:

class Graph

 def euler_path?

return false if !connected?

odd=0

each_vertex do |x|

if degree(x) % 2 == 1

odd += 1

end

end

odd <= 2

 end

end

mygraph = Graph.new([0,1],[1,2],[1,3],[2,3],[3,0])

flag1 = mygraph.euler_circuit? # false

flag2 = mygraph.euler_path? # true

9.4.5. Инструменты для работы с графами в Ruby

В сообществе пользователей Ruby известно несколько таких инструментов. Они в большинстве своем имеют ограниченную функциональность и предназначены для работы с ориентированными или неориентированными графами. Поищите эти инструменты в архиве RAA или на сайте Rubyforge . Называются они как-то вроде RubyGraph, RGraph, GraphR и по большей части еще не достигли зрелости.

Поделиться:
Популярные книги

Клоун

Юань Е
1. Повелитель тайн
Фантастика:
фэнтези
эпическая фантастика
5.00
рейтинг книги
Клоун

Противостояние. Том I

Кинг Стивен
Фантастика:
социально-философская фантастика
научная фантастика
ужасы и мистика
8.18
рейтинг книги
Противостояние. Том I

В. И. Ленин и ВЧК. Сборник документов (1917–1922)

Ленин Владимир Ильич
Документальная литература:
прочая документальная литература
6.25
рейтинг книги
В. И. Ленин и ВЧК. Сборник документов (1917–1922)

Меняя маски

Метельский Николай Александрович
1. Унесенный ветром
Фантастика:
боевая фантастика
попаданцы
9.22
рейтинг книги
Меняя маски

Шайтан Иван 4

Тен Эдуард
4. Шайтан Иван
Фантастика:
попаданцы
альтернативная история
8.00
рейтинг книги
Шайтан Иван 4

"Фантастика 2023-94". Компиляция. Книги 1-16

Перумов Ник
Фантастика 2023. Компиляция
Фантастика:
боевая фантастика
5.00
рейтинг книги
Фантастика 2023-94. Компиляция. Книги 1-16

"Фантастика 2024-68". Компиляция. Книги 1-22

Фролов Андрей
Фантастика 2024. Компиляция
Фантастика:
фэнтези
боевая фантастика
космическая фантастика
попаданцы
альтернативная история
рпг
5.00
рейтинг книги
Фантастика 2024-68. Компиляция. Книги 1-22

Петлистые времена(Повести. Рассказы)

Лукин Евгений Юрьевич
Фантастика:
научная фантастика
5.00
рейтинг книги
Петлистые времена(Повести. Рассказы)

Основы медицинских знаний

Айзман Роман Иделевич
Научно-образовательная:
медицина
5.00
рейтинг книги
Основы медицинских знаний

"Фантастика 2023-178". Компиляция. Книги 1-25

Первухина Надежда Валентиновна
Фантастика 2023. Компиляция
Фантастика:
фэнтези
боевая фантастика
5.00
рейтинг книги
Фантастика 2023-178. Компиляция. Книги 1-25

Свободное радио Альбемута (сборник)

Дик Филип Киндред
Шедевры фантастики
Фантастика:
научная фантастика
5.00
рейтинг книги
Свободное радио Альбемута (сборник)

Князь Медведев. Дилогия

Вяч Павел
Медведев
Фантастика:
аниме
фэнтези
попаданцы
5.67
рейтинг книги
Князь Медведев. Дилогия

Егерь. Прилив. Книга 10

Скиба Николай
10. Зверолов
Фантастика:
рпг
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Егерь. Прилив. Книга 10

Кодекс Охотника. Книга XL

Винокуров Юрий
40. Кодекс Охотника
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Кодекс Охотника. Книга XL