Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Kurs_Деревья Трента.doc
Скачиваний:
5
Добавлен:
11.07.2019
Размер:
758.27 Кб
Скачать

1.7 Определение дерева кратчайших путей по алгоритму Дейкстры

В работе требуется определить кратчайший маршрут от вершины 0 до вершины 9 по алгоритму Дейкстры. В данном параграфе рассматриваем граф как неориентированный (игнорируем направленность дуг, полагая их ребрами).

Достижимость минимальных весов:

q0,2 = 3;

q0,3 = 5;

q0,8 = 6;

q0,7 = 7;

q0,1 = 8;

q0,9 = 8.

Можно продолжать расчеты по алгоритму Дейкстры для вершин 4, 5 и 6, но они уже не повлияют на полученное решение.

Рисунок 1.15 – Кратчайшие пути, полученные по алгоритму Дейкстры

1.8. Поиск всех деревьев на графе.

Пусть задан граф, рис.1.16.

Рисунок 1.16 – Исходный граф для поиска всех деревьев.

Определим количество деревьев с помощью матрицы Кирхгофа и алгоритма Трента. Матрица (по диагонали степени вершин, элементы – число путей со знаком «-»).

По алгоритму выбираем один из главных миноров (вычеркиваем строку и столбец, соответствующие элементу главной диагонали). Например, 1 и 1 – в данном случае это полностью безразлично, граф полносвязный без кратных ребер.

Итого, мы ожидаем получить 16 деревьев. Получим их. Запишем списки смежности вершин и ребер:

Поскольку в графе 4 вершины, достаточно 3 списков (в дереве ребер на одну меньше вершин).

Комбинируем списки для получения деревьев.

пару 1-1 отбрасываем (одинаковые ребра).

Комбинация из трех вершин:

Отбрасываем столбцы с повторяющимися цифрами: их 6 – 1-2-2, 3-1-3, 3-2-2, 3-2-3, 3-4-3 и 5-2-2. Остается 18 столбцов. Но среди них есть два столбца с одинаковыми ребрами, отбрасываем оба: 1-2-3 и 3-1-2. Остается 16 столбцов, т.е. 16 деревьев, как мы и рассчитали по матрице. Повторим их список и изобразим все деревья на рисунке.

Рисунок 1.17 – Усі дерева графу.

2. Постановка задачи на программирование

Задача 1

Определить, является ли граф Эйлеровым?

Исходные данные:

Граф вводится в графическом диалоге, или путем заполнения матрицы смежности, или чтением матрицы смежности из файла.

Алгоритм:

Определяем степени вершин, если они все четные – у графа есть Эйлеров цикл, если нечетных степеней только 2 – Эйлеров путь.

Вывод:

Сообщение о результат расчетов выводится на экран и/или в текстовый файл.

Примечание:

Один из загружаемых файлов – граф из задания.

Задача 2

Определить, количества деревьев графа с помощью матрицы Трента.

Исходные данные:

Граф вводится в графическом диалоге, или путем заполнения матрицы смежности, или чтением матрицы смежности из файла.

Алгоритм:

Заполняем матрицу Трента: по диагонали степени вершин, в ячейках – количество связей с отрицательным знаком. Считаем один из главных миноров.

Вывод:

Сообщение о результат расчетов выводится на экран и/или в текстовый файл.

Примечание:

Один из загружаемых файлов – граф из задания.

2.2 Описание разработанного объекта

2.2.1 Иерархия наследования

Для работы с графами мною создан собственный класс tgraf, который имеет следующую структуру:

type

tgraf=class

private

fn:integer;

fa:array of array of integer;

fb:array of array of integer;

fc:array of array of integer;

a1:array of array of integer;

a2:array of array of integer;

b1:array of array of integer;

b2:array of array of integer;

fi:integer;

fj:integer;

fk:integer;

procedure seti(const value:integer);

procedure setj(const value:integer);

procedure setk(const value:integer);

procedure setn(const value:integer);

public

property i:integer read fi write seti;

property j:integer read fj write setj;

property k:integer read fk write setk;

function cikl:boolean;

function ejler:boolean;

function fmin:integer;

procedure setab;

procedure setc;

procedure obnul;

procedure setvalue1;

procedure setvalue3;

procedure setvalue2(const value:integer);

property n:integer read fn write setn;

function Getvalue1(ind1,ind2:integer):integer;

function Getvalue2(ind1,ind2:integer):integer;

function Getvalue3(ind1,ind2:integer):integer;

end;

Разработанный класс не имеет в скобках указания на наследование, а значит, наследует по умолчанию от TObject, рис.2.1.

Рисунок 2.1 – Иерархия наследования моего класса.

2.2.2. Организация объекта

Для данного класса реализованы идеи инкапсуляции, включая инкапсуляцию, основанную на разделах private и public. Основное внимание уделено инкапсуляции, основанной на свойствах. Сокрытой частью класса является раздел private, в котором определены:

поле Fn – содержит количество элементов динамически создаваемых массивов (по сути – количество вершин в графах);

поля Fa, Fb, Fc – двумерные динамические массивы целых чисел (указатели на массивы целых чисел) предполагают работу с координатами вершин, ребрами графа;

методы SetI, SetJ, SetK и SetN реализуют инициализацию полей Fi, Fj, Fk и Fn. Правило гласит, что доступ к полям класса должны осуществлять только методы данного класса.

Данное ограничение легко реализуется с помощью механизма свойств, которые описаны в разделе public и являются общедоступными. Наиболее часто применимая конструкция свойств – это отражение чтения данных на поле класса, а запись на метод класса (обычно при записи данных осуществляется дополнительная проверка контроля). Например:

property i:integer read fi write SetI

Методы класса реализуются с помощью процедур и функций. В общедоступном разделе public содержатся следующие методы:

function cikl:boolean; – определение наличия циклов;

function ejler:boolean; – проверка, является ли граф эйлеровым;

function fmin:integer; – минимальная степень графа;

procedure obnul; – обнуление числовых матриц графа.

2.3. Интерфейс программы

Интерфейс программы приведен на рис.2.2.

Рисунок 2.2 – Интерфейс программы

Дружественный графический интерфейс моей программы ориентирован на то, чтобы пользователь сразу видел доступные ему функции по созданию графа и расчету числовых характеристик.

Верхнее иконочное меню в основном ориентировано на создание графа. Каждый пункт меню имеет собственный hint-подсказку, а потому на рисунке не прокомментирован. Тем не менее перечислим все выполняемые этими кнопками функции (слева направо):

- очистить поле от нарисованного графа;

- сохранить нарисованный граф для последующей загрузки и расчетов;

- произвести вычисления;

- режим «бездействия» (верхнее меню неактивно);

- создание вершин (щелчок мыши на черном поле, кружки-shape вершин нумеруются автоматически);

- соединение вершин ребрами (щелчок мышью на исходной и конечной вершинах, щелчок на черном поле ни к каким действиям не ведет);

- указание направления дуг (осуществляется двумя щелчками мыши от стартовой к финишной вершинам);

- ввод веса ребер или дуг;

- соединение всех вершин (автоматические получение полносвязного неориентированного графа);

- вызов справки (обращение к собственному hlp-файлу).

Нижний многостраничный компонент после нажатия зеленой стрелки «Вычислить» выводит результаты расчетов. Например, как это показано на рис.2.3.

Рисунок 2.3 – Результаты расчетов в многостраничном компоненте

ЗАКЛЮЧЕНИЕ

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

Разработана программа на языке Object Pascal в среде Delphi 7.0, позволяющая выполнить это в автоматизированном режиме.

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

Список использованных источников

  1. Сигорский В.П. Математический аппарат инженера. – Киев: Техника, 1975. – 768 с.

  2. Берж К. Теория графов и ее применения. – М.: Изд-во иностранной литературы, 1962. – 319 с.

  3. Кристофидес Н. Теория графов: Алгоритмический подход. – М.: Мир, 1978. – 432 с.

  4. Романовский И.В. Дискретный анализ. Учебное пособие для студентов, специализирующихся по прикладной математике и информатике. – СПб.: Невский диалект, 2001. – 240 с.

  5. Новиков Ф.А. Дикретная математика для программистов. – СПб.-М.-Харьков: Питер, 2001. – 304 с.

  6. Кенту М. Delphi 7 для профессионалов. – М.-СПб.-Харьков: Питер, 204. – 1101 с.

  7. Голованов М., Веселов Е. Создание компонентов в среде Delphi. Руководство разработчика. – СПб.: БХВ-Петербург, 2004. – 320 с.

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