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

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

Жанры

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

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

Под графом мы обычно понимаем неориентированный граф. Попросту говоря, в нем не проставлены стрелки на соединительных линиях; две вершины либо соединены, либо нет. Между тем в ориентированном графе (орграфе) могут быть «улицы с односторонним движением»; из того, что вершина x соединена с вершиной у, не следует, что верно и обратное. Наконец, во взвешенном графе ребрам можно назначать веса. Например, вес может выражать «расстояние» между вершинами. Мы ограничимся только этими основными видами графов; интересующегося читателя отсылаем к многочисленным учебникам информатики и математики.

В Ruby, как и во многих других языках, граф можно представить разными способами, например в виде настоящей сети взаимосвязанных объектов или в виде матрицы, в которой хранятся ребра графа. Мы рассмотрим оба способа и на примерах покажем, как можно манипулировать графами.

9.4.1. Реализация графа в виде матрицы смежности

Нижеприведенный пример основан на двух предыдущих. В листинге 9.3 неориентированный граф реализован в виде матрицы смежности с помощью класса

ZArray
(см. раздел 8.1.26). Это нужно для того, чтобы новые элементы по умолчанию получали значение 0. Также мы унаследовали классу
TriMatrix
(см. раздел 8.1.7), чтобы получить нижнетреугольную матрицу.

Листинг 9.3. Матрица смежности

class LowerMatrix < TriMatrix

 def initialize

@store = Zarray.new

 end

end

class Graph

 def initialize(*edges)

@store = LowerMatrix.new

@max = 0

for e in edges

e[0], e[1] = e[1], e[0] if e[1] > e[0]

@store[e[0],e[1]] = 1

@max = [@max, e[0], e[1]].max

end

 end

 def [](x,y)

if x > y

@store[x,y]

elsif x < y

@store[y,x]

else

0

end

 end

 def []=(x,y,v)

if x > y

@store[x,y]=v

elsif x < y

@store[y,x]=v

else

0

end

 end

 def edge? x,y

x,y = y,x if x < y

@store[x,y]==1

 end

 def add x,y

@store[x,y] = 1

 end

 def remove x,y

x,y = y,x if x < y

@store[x,y] = 0

if (degree @max) == 0

@max -= 1

end

 end

 def vmax

@max

 end

 def degree x

sum = 0

0.upto @max do |i|

sum += self[x,i]

end

sum

 end

 def each_vertex

(0..@max).each {|v| yield v}

 end

 def each_edge

for v0 in 0..@max

for v1 in 0..v0-1

yield v0, v1 if self[v0,v1]==1

end

end

 end

end

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

# Напечатать степени всех вершин: 2 3 2 3.

mygraph.each_vertex {|v| puts mygraph.degree(v)}

# Напечатать список ребер.

mygraph.each_edge do |a,b|

 puts "(#{a},#{b})"

end

# Удалить одно ребро.

mygraph.remove 1,3

# Напечатать степени всех вершин: 2 2 2 2.

mygraph.each_vertex {|v| p mygraph.degree v}

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

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

vmax
возвращает вершину с наибольшим номером. Метод
degree
вычисляет степень указанной вершины, то есть количество исходящих из нее ребер.

Наконец, имеются два итератора

each_vertex
и
each_edge
, которые позволяют перебрать все вершины и все ребра соответственно.

9.4.2. Является ли граф связным?

Не все графы связные. Иногда нет способа «добраться из одной точки в другую», то есть между двумя вершинами нет никакого пути, составленного из ребер. Связность — это важное свойство графа, его надо уметь вычислять. В связном графе любая вершина достижима из любой другой.

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

Открытие мира (Весь роман в одной книге)

Смирнов Василий Александрович
Проза:
классическая проза
русская классическая проза
советская классическая проза
5.00
рейтинг книги
Открытие мира (Весь роман в одной книге)

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

Суржевская Марина
Фантастика 2024. Компиляция
Фантастика:
боевая фантастика
детективная фантастика
попаданцы
5.00
рейтинг книги
Фантастика 2024-21. Компиляция. Книги 1-21

Библия. Новый русский перевод

Коллектив авторов
Религия и эзотерика:
христианство
6.57
рейтинг книги
Библия. Новый русский перевод

Фауст

фон Гёте Иоганн Вольфганг
50. Библиотека всемирной литературы
Поэзия:
драматургия
8.33
рейтинг книги
Фауст

Практические основы кулинарного искусства. Краткий популярный курс мясоведения

Игнатьев Михаил
Дом и Семья:
кулинария
6.25
рейтинг книги
Практические основы кулинарного искусства. Краткий популярный курс мясоведения

Собрание сочинений (Том 1)

Лиханов Альберт Анатольевич
Детские:
прочая детская литература
5.00
рейтинг книги
Собрание сочинений (Том 1)

Средневековая история. Тетралогия

Гончарова Галина Дмитриевна
Средневековая история
Фантастика:
фэнтези
попаданцы
9.16
рейтинг книги
Средневековая история. Тетралогия

Тактика победы

Кутузов Михаил Илларионович
Великие полководцы
Документальная литература:
биографии и мемуары
6.25
рейтинг книги
Тактика победы

#Бояръ-Аниме. Газлайтер. Том 13

Володин Григорий Григорьевич
13. История Телепата
Фантастика:
боевая фантастика
аниме
попаданцы
фэнтези
7.33
рейтинг книги
#Бояръ-Аниме. Газлайтер. Том 13

Золото бунта

Иванов Алексей Викторович
Приключения:
исторические приключения
7.50
рейтинг книги
Золото бунта

Молот Пограничья. Гексалогия

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

Сердце Дракона. Том 10

Клеванский Кирилл Сергеевич
10. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.14
рейтинг книги
Сердце Дракона. Том 10

В лапах зверя

Зайцева Мария
1. Звериные повадки Симоновых
Любовные романы:
остросюжетные любовные романы
эро литература
5.00
рейтинг книги
В лапах зверя

Барон Бранд Берс. Том 3

Limonad
3. Бранд Берс
Проза:
магический реализм
5.00
рейтинг книги
Барон Бранд Берс. Том 3