Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2_SAOD_-_Dinamicheskie_struktury_dannykh.doc
Скачиваний:
124
Добавлен:
21.03.2016
Размер:
1.66 Mб
Скачать
  1. Реализация графа

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

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

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

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

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

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

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

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

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

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); // просмотр графа

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

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

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

end; // tOrGraph

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]