Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика_и_Пр_Бизнес_лекции.doc
Скачиваний:
82
Добавлен:
10.05.2015
Размер:
1.21 Mб
Скачать

10.3.5. Матрица достижимости. Алгоритм Уоршалла

Mатрица достижимости – это квадратная матрица d из n строк и n столбцов, где n количество вершин графа, в которой dij=1, если в графе существует путь от вершины i до вершины j, и dij = 0 в противном случае.

Пример матрицы достижимости для графа, изображенного на рис. 5, приведен на рис. 9.

1

1

1

0

1

1

0

1

0

0

0

0

1

1

1

0

1

1

1

1

1

1

1

1

0

0

0

0

1

0

1

1

1

0

1

1

Рис. 9. Матрица достижимости

Для построения матрицы достижимости используется алгоритм Уоршалла.

В начале алгоритма на основе матрицы смежности выполняется инициализация матрицы достижимости: 1 расставляются для прямых путей между вершинами графа (если a[i][j]!=0, то d[i][j]=1) и для элементов главной диагонали матрицы (d[i][i]=1), остальные элементы заполняются 0. Далее над матрицей достижимости выполняется n итераций, чтобы узнать, можно ли достигнуть из i-вершины j-вершину через k-вершину. Если пары вершин i, k и k, j связаны, то вершина j достижима из вершины i.

Текст функции, реализующей алгоритм Уоршалла:

void Warshall(int d[ ][size], int a[ ][size ], int n)

/* d –матрица достижимости, а – матрица смежности, n – количество вершин графа, size глобальная константа */

{

int i, j, k; //номера вершин

//Начальное заполнение матрицы достижимости

for (i=0; i<=n-1; i++)

for (j=0; j<=n-1; j++)

if(i==j)

d[i][j]=1;

else

if (a[i][j]==0)

d[i][j]=0;

else

d[i][j]=1;

//Выполнение n итераций над матрицей

for (k=0; k<=n-1; k++)

for (i=0; i<=n-1; i++)

for (j=0; j<=n-1; j++)

if (d[i][j]==0)

if (d[k][j]==1 && d[i][k]==1)

d[i][j]=1;

}

Матрицу достижимости (ее также называют транзитивным замыканием матрицы смежности) можно использовать для проверки существования пути между двумя вершинами графа. Текст функции, использующей матрицу достижимости для проверки существования пути между двумя вершинами графа:

bool path (int i, int j, int a[ ][size ], int n)

// i и j – номера вершин

// а – матрица смежности

// n – количество вершин графа

// size – глобальная константа (максимальное количество вершин)

{

int d[size][size]; // матрица достижимости

//Формирование матрицы

Warshall(d, a, n);

return d[i][j];

}

Дополнительные сведения об алгоритмах выполнения операций над графом, таких как поиск в глубину, поиск сильно связанной компоненты, проверка ацикличности графа, вывода кратчайшего пути, приведены в [4-6].

Библиографический список

  1. Павловская Т.А. С/ С++. Программирование на языке высокого уровня. – СПб.: Питер, 2002

  2. Дейтл Х.М., Дейтл П.Дж. Как программировать на С++. – М.: Бином -2000

  3. Вирт Н. Алгоритмы и структуры данных. – СПб.: Невский Диалект, 2001

  4. Ахо А., Хопкрофт Дж., Ульман Дж. Структуры данных и алгоритмы. – М.: Издательский дом «Вильямс», 2001

  5. Седжвик Р. Фундаментальные алгоритмы на С++. Алгоритмы на графах. Часть 5. – М.: ДиаСофт, 2002

  6. Алексеев В.Е., Таланов В.А. Графы и алгоритмы. Структуры данных. Модели вычислений. – М.: Бином, 2006

СОДЕРЖАНИЕ

Введение 3

1.Знакомство с языком С++ 4

1.1. Элементы языка программирования 4

1.2. Алфавит языка 6

1.3. Лексемы 7

1.4. Концепция данных 8

2.Основные типы данных 9

2.1.Обьявление переменных 9

2.2. Операции 11

2.2.1. Арифметические операции 14

2.2.2. Операции присваивания 15

2.2.3. Операции отношения 16

2.2.4. Логические операции 16

2.2.5. Поразрядные операции 17

2.2.6. Вычисление выражений 20

3. Структурное программирование 21

3.1. Общая характеристика операторов 21

3.2. Оператор-выражение 22

3.3. Условный оператор 22

3.4. Составной оператор 24

3.5. Операторы для программирования циклов 24

3.5.1. Оператор цикла for 25

3.5.2. Оператор цикла while 26

3.5.3. Оператор цикла do while 26

3.5.4. Оператор break 27

3.5.5. Оператор continue 28

3.6. Оператор goto 29

3.7. Пустой оператор 29

3.8. Оператор switch 30

3.9. Оператор return 31

4. Массивы 32

4.1. Объявление массива 32

4.2. Обращение к элементам массива 33

4.3. Типовые алгоритмы работы с массивами 34

4.4. Многомерные массивы 37

5. Строки 39

5.1. Объявление строки 39

5.2. Посимвольная обработка строк 40

5.3. Ввод строк 41

5.4. Библиотечные функции для работы с текстом 43

6. Указатели 46

6.1. Объявление указателей 46

6.2. Операции над указателями 47

6.3. Связь между указателями и массивами 51

6.4. Функция strtok для выделения лексем из текста 52

6.5. Динамические массивы 54

7. Структуры и объединения 56

7.1. Объявление структуры 56

7.2. Операции над структурами 57

7.3. Объявление объединения 60

8. Модульное программирование 60

8.1. Нисходящее проектирование и программирование 60

8.2. Определение и вызов функции 63

8.3. Место определения функции в программе 65

8.4. Обмен данными между функциями 69

8.4.1. Использование глобальных переменных 70

8.4.2. Использование аппарата формальных и фактических параметров 72

8.4.3. Передача массивов в функцию 75

8.5. Перегрузка функции 79

8.6. Шаблон функции 83

8.7. Рекурсивные функции 87

8.8. Функции с параметрами по умолчанию 89

8.9. Передача в функцию другой функции 91

9. Работа с файлами 93

9.1. Текстовые и двоичные файлы 94

9.2. Объявление файловых переменных 95

9.3. Чтение текстового файла 98

9.4. Создание текстового файла 100

9.5. Изменение данных в текстовом файле 102

9.6. Вывод в двоичный файл 104

9.7. Чтение данных из двоичного файла 105

9.8. Изменение данных двоичного файла 107

9.9. Организация файла с произвольным доступом 109

10. Данные с динамической структурой 110

10.1. Линейный список 110

10.1.1. Специальные типы линейных списков 111

10.1.2. Реализация линейного списка с помощью массива 112

10.1.3. Реализация линейного списка с помощью связанного однонаправленного списка 115

10.1.4. Реализация линейного списка с помощью связанного двунаправленного списка 120

10.2. Деревья 123

10.2.1. Основная терминология 123

10.2.2. Реализация двоичных деревьев поиска 125

10.2.3. Сбалансированные деревья 129

10.2.4. В-деревья 132

10.3. Графы 133

10.3.1. Определения 134

10.3.2. Реализация графа с помощью списков смежности 135

10.3.3. Реализация графа с помощью матрицы смежности 138

10.3.4. Поиск кратчайших путей. Алгоритм Дейкстры 144

10.3.5. Матрица достижимости. Алгоритм Уоршалла 147

Библиографический список 149

Андреева Людмила Петровна

Программрование

Курс лекций

Изд. лицензия №020456 от 04.03.97

Подписано в печать 00.00.0000. Формат 60х84 1/16

Бумага офсетная. Печать офсетная.

Усл. печ.л. 8,2. Усл.кр.-отт. 35,34. Уч.-изд.л. 9,5

Тираж 100 экз. Заказ 00. Бесплатно

Московский государственный институт радиотехники,

электроники и автоматики (технический университет)

117454, Москва, просп. Вернадского, 78

1 Рисунок из Википедии www.ru.wikipedia.org

2 Рисунок из Википедии www.ru.wikipedia.org