Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
САОД Part 1.DOC
Скачиваний:
41
Добавлен:
02.11.2018
Размер:
1.68 Mб
Скачать
  1. Операции над графом

Над графом g могут быть выполнены следующие операции:

– возвращение адреса узла со значением vNodeAddr(g, v);

– проверка смежности узлов Node1 и Node2 – ArcAddr(g, Node1, Node2);

– возвращение начального узла дуги ArcHeadNode(g, Arc);

– возвращение конечного узла дуги ArcRearNode(g, Arc);

– возвращение информации, содержащейся в узле, – Value(g, Node);

– проверка наличия узлов в графе – Empty(g);

– включение дуги между узлами Node1 и Node2AddArc(g, Node1, Node2);

– исключение дуги между узлами Node1 и Node2DeleteArc(g, Node1, Node2);

– включение узла со значением v в граф – AddNode(g, v);

– исключение из графа узла Node с исключением инцидентных ему дуг и возвращение значения информационного поля узла – DeleteNode(g, Node);

– определение количества узлов в графе – NodesQuantity(g);

– просмотр графа – Revision(g);

– создание пустого графа – Create(g);

– удаление всех узлов и дуг графа – Clear(g);

– построение графа – Build(g).

С использованием вышеперечисленных операций можно реализовать более сложные операции: определение расстояния (кратчайшего пути) между двумя заданными узлами графа; поиск узлов в графе; определение путей между двумя заданными узлами графа и их длин и др.

Графы применяют для решения задач планирования и распределения работ проекта, транспортных задач, задач о потоках в сетях и других.

  1. Реализация графа

Одним из способов представления графа является матричный способ. При представлении графа с помощью матрицы инцидентности строки матрицы соответствуют узлам графа, а столбцы – дугам; на пересечении каждой строки и столбца ставится 1, если дуга инцидентна узлу, и 0 в противном случае.

Граф представляют также с помощью матрицы смежности узлов. И строки и столбцы матрицы при этом соответствуют узлам графа, а на пересечении каждой строки и столбца ставится 1, если соответствующие узлы смежные, и 0 в противном случае.

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

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

Списковое представление является одним из наиболее удобных и универсальных способов представления графа и позволяет представлять любые графы: ориентированные и неориентированные, взвешенные и невзвешенные, хранить информацию, связанную с дугами и узлами графа.

Рассмотрим один из способов связанного представления графа. Узлы графа объединяются в список, каждый элемент которого содержит три поля: Value (информация, связанная с узлом графа), NextNode (указатель на следующий элемент списка узлов графа) и ArcList (указатель на список дуг, выходящих из данного узла, – список смежности). Каждый элемент списка смежности представляет дугу графа и содержит два поля: RearNode (указатель на элемент в списке узлов графа, которым заканчивается дуга) и NextArc (указатель на следующий элемент списка смежности данного узла). Для взвешенного графа элемент списка дуг должен содержать дополнительное поле Weight (вес дуги). Для неориентированного графа список дуг для каждого узла должен содержать все дуги, инцидентные этому узлу (входящие и выходящие), при этом каждая дуга будет присутствовать в представлении графа дважды, так как инцидентна двум узлам.

Пример ориентированного невзвешенного графа и его представление с помощью линейных односвязных списков:

Переменная ссылочного типа Head указывает на начало списка узлов графа. Каждый узел Node графа состоит из трех полей: Value, ArcList и NextNode. Дуга Arc содержит два поля: NextArc и RearNode. Последний узел графа и последняя дуга из списка дуг каждого узла содержат указатель nil. Поле ArcList узла содержит значение nil в том случае, если этот узел не имеет исходящих из него дуг.

Описание класса tOrGraph (Oriented Graph – ориентированный граф) с использованием линейных односвязных списков имеет вид:

type

tValue = Char; // тип информационной части узла графа – Char

pArc = ^tArc; // тип указателя на дугу графа

pNode = ^tNode; // тип указателя на узел графа

tNode = record // тип узла графа

Value : tValue; // информационная часть узла графа

NextNode : pNode; // указатель на следующий узел графа

ArcList : pArc; // указатель на список смежности узла

end; // tNode

tArc = record // тип элемента списка смежности узла - дуги графа

RearNode : pNode; // указатель на узел, являющийся концом дуги

NextArc : pArc; // указатель на следующую дугу узла графа

end; // tArc

tOrGraph=class // класс – ориентированный граф

protected

fHead: pNode; // поле - указатель на начало списка узлов

fNodesNumber: Word; // поле - количество узлов графа

fArcsNumber: Word; // поле - количество дуг графа

public

property Head: pNode read fHead write fHead;

property NodesNumber: Word read fNodesNumber write fNodesNumber;

property ArcsNumber: Word read fArcsNumber write fArcsNumber;

function NodeValue(Node: pNode):tValue; // значение узла Node

function NodeAddr(v: tValue): pNode; // адрес узла графа со значением v

function ArcAddr(Node1,Node2: pNode):pArc; // смежность узлов

function HeadNode(ArcNode: pArc): pNode; // начальный узел дуги

function RearNode(ArcNode: pArc): pNode; // конечный узел дуги

function Empty: Boolean; // наличие узлов в графе

procedure AddArc(Node1,Node2: pNode); // включение дуги

procedure DeleteArc(Node1,Node2: pNode); // исключение дуги

procedure AddNode(v: tValue); // включение узла

function DeleteNode(DisNode:pNode): tValue; // исключение узла

procedure Build(var f:Text); // построение графа

procedure Revision(var f:Text); // просмотр графа

procedure Clear; // удаление всех узлов графа

constructor Create; // конструктор графа

destructor Destroy; // деструктор графа

end; // tOrGraph