
- •Тема 1. Стеки, очереди, деки 7
- •Тема 2. Односвязные и двусвязные линейные списки 21
- •Тема 3. Бинарные деревья 40
- •Тема 4. Графы 65
- •Введение
- •Терминология
- •Классификация структур данных по различным признакам
- •Типовые операции над структурами данных
- •Эффективность алгоритмов. O-обозначения
- •Тема 1. Стеки, очереди, деки
- •Операции над стеком
- •Реализация стека
- •Реализация основных операций над стеком
- •Использование стека для преобразования форм записи выражений.
- •Очередь
- •Операции над очередью
- •Операции над деком
- •Реализация очереди и дека
- •Реализация основных операций над очередью и деком
- •Итератор
- •Лабораторная работа 1. Стеки, очереди, деки
- •Тема 2. Односвязные и двусвязные линейные списки
- •Линейный список
- •Операции над линейным списком
- •Реализация линейного списка в виде односвязной динамической структуры
- •Реализация основных операций над односвязным списком
- •Циклический список
- •Операции над циклическим списком
- •Односвязная реализация циклического списка
- •Реализация основных операций над односвязным циклическим списком
- •Реализация линейного списка в виде двусвязной динамической структуры
- •Реализация основных операций над двусвязным списком
- •Циклический двусвязный список
- •Реализация основных операций над двусвязным циклическим списком
- •Лабораторная работа 2. Односвязные и двусвязные линейные списки
- •Тема 3. Бинарные деревья
- •Основные понятия и определения
- •Построение бинарного дерева
- •Операции над бинарным деревом
- •Реализация бинарного дерева
- •Реализация основных операций над бинарным деревом
- •Дерево выражения
- •Дерево поиска
- •Операции над деревом поиска
- •Реализация дерева поиска
- •Реализация операций над деревом поиска
- •Сбалансированные деревья
- •Включение в сбалансированное дерево
- •Лабораторная работа 3. Бинарные деревья
- •Тема 4. Графы
- •Основные понятия и определения
- •Граф g7
- •Операции над графом
- •Реализация графа
- •Реализация основных операций над ориентированным графом
- •Обход ориентированного графа
- •Вычисление расстояния между узлами ориентированного графа
- •Лабораторная работа 4. Ориентированные графы
- •Библиографический список
Лабораторная работа 4. Ориентированные графы
Задание
Опишите класс – ориентированный граф, необходимый для решения задачи, указанной в вашем варианте задания, и реализуйте его методы. Составьте программу решения задачи, указанной в вашем варианте задания. В программе необходимо продемонстрировать работу основных методов работы с графом: построение, вывод, просмотр (т.е. программа должна иллюстрировать работу с графом как в примере выполнения задания).
Исходный граф может содержать петли и циклы.
Если требуется реализовать граф с помощью циклического или двусвязного списка, то в число обязательных операций должны быть включены: построение, обход, очистка графа и операции, необходимые для их реализации. Специальные для каждого задания операции указаны в скобках.
Варианты заданий
-
Определить кратчайший путь между узлами n1 и n2 и его длину во взвешенном графе.
-
Определить, является ли один граф подграфом другого.
-
Задана карта дорог в виде графа. Найти города, расположенные на расстоянии более X от заданного узла.
-
Реализовать граф с помощью односвязных циклических списков (включение и исключение узла).
-
Найти все узлы графа, к которым можно добраться из заданного узла.
-
Определить кратчайший путь между узлами n1 и n2 и его длину во взвешенном графе.
-
Определить, является ли ориентированный граф несвязным.
-
Составить список узлов, расстояние от которых до заданного узла не превышает величину X.
-
Определить, является ли один граф суграфом другого.
-
Реализовать граф с помощью односвязных циклических списков (определение начального и конечного узлов каждой дуги).
-
Найти все узлы графа, из которых можно добраться до заданного узла.
-
Определить расстояние между узлами n1 и n2 во взвешенном циклическом графе.
-
Определить, является ли один граф частью другого.
-
На основе обхода в ширину найти все узлы заданного графа, недостижимые из заданного узла.
-
На основе поиска в ширину определить, является ли граф несвязным.
-
Перечислить узлы графа по возрастанию расстояния до них от заданного узла.
-
Реализовать граф с помощью двусвязных списков (включение и исключение узла).
-
Задана карта дорог в виде графа. Найти города, расположенные на расстоянии X от заданного узла.
-
На основе обхода в ширину найти узел с заданным значением в графе и исключить его.
-
Найти узел графа, ближайший к заданному злу.
-
На основе поиска в ширину определить, является ли граф связным.
-
Реализовать граф с помощью односвязных циклических списков (включение и исключение дуги, определение количества узлов).
-
Найти все циклы в графе.
-
Определить, является ли один граф дополнением другого.
-
Задана карта дорог в виде графа. Найти города, расположенные на расстоянии не более X от заданного узла.
-
На основе обхода в глубину найти все узлы заданного графа, недостижимые из заданного узла.
-
Определить, является ли граф полным.
-
Найти все узлы графа, к которым можно добраться из заданного узла по пути не длиннее заданного значения.
-
Определить длины всех путей между узлами n1 и n2 в невзвешенном графе.
-
Найти узел графа, наиболее удаленный от заданного узла.
Пример выполнения задания
Программа LW4 иллюстрирует выполнение основных операций над ориентированным графом. Предполагается, что описание класса – графа и реализация его методов содержатся в модуле Graphs.tpu.
Файл с исходными данными LW4Dat.txt содержит информацию о следующем графе:
Множество узлов – {A, B, C, D, E, F}, множество дуг – {(A, B), (A, D), (B, C), (C, A), (C, D), (D, E), (E, C), (E, F), (F, C)}.
После построения в граф включаются узел X и дуга между узлами F и X, затем исключается узел E. После каждого изменения графа выполняются его обход и вывод.
// Лабораторная работа 4. Ориентированные графы.
// Выполнил Сергеев Андрей, группа 500.
// Исходные данные - узлы и дуги графа - в файле LW4Dat.txt
// Результаты работы помещаются в файл LW4Res.txt
program LW4;
{$APPTYPE CONSOLE}
uses
SysUtils,
Graphs in 'Graphs.pas';
var
Graph : tOrGraph; // экземпляр ориентированного графа
fDat, fRes : Text; // файлы исходных данных и результатов
Node1,Node2: pNode; // вспомогательные указатели на узлы графа
v1, v2 : tValue; // значения элементов графа
begin
try
Assign(fDat, ‘LW4Dat.txt'); Reset(fDat);
Assign(fRes,'LW4Res.txt'); Rewrite(fRes);
WriteLn(fRes, 'Работа с графом');
Graph := tOrGraph.Create; // создание экземпляра графа
Graph.Build(fDat); // построение графа
Graph.Revision(fRes); // просмотр графа и вывод элементов в файл fRes
WriteLn(fRes,'Число узлов графа: ',Graph.NodesNumber);
WriteLn(fRes,'Число дуг графа: ',Graph.ArcsNumber);
// Включение узла со значением 'X'
v1:='X'; WriteLn(fRes, 'Значение включаемого элемента = ',v1);
Graph.AddNode(v1);
Graph.Revision(fRes);
// Включение дуги между узлами 'F' и 'X'
v1:='F'; v2:='X';
WriteLn(fRes, 'Включается дуга между узлами ', v1,' и ',v2);
Node1:=Graph.NodeAddr(v1);
Node2:=Graph.NodeAddr(v2);
if (Node1<>nil) and (Node2<>nil) then Graph.AddArc(Node1,Node2);
Graph.Revision(fRes); // просмотр графа
// Исключение узла 'E' с инцидентными ему дугами
v1:='E';
WriteLn(fRes, 'Исключается узел ', v1);
Node1:=Graph.NodeAddr(v1);
if Node1<>nil then Graph.DeleteNode(Node1); Graph.Revision(fRes);
Graph.Free;
finally
Close(fDat); Close(fRes);
end;
end.