9.4. Описание программной реализации
Для реализации алгоритмов используем динамическую структуру – двусвязный список. С его помощью можно легко реализовать все алгоритмические операции, так целесообразнее будет сортировать ребра графа в процессе формирования списка, что уменьшает количество производимых операций до минимума. Легко производить удаление из списка ребер, которые приводят к зацикливанию, что не допустимо.
Каждый элемент списка имеет поле weight – вес ребра, point1 – номер начальной вершины, point2 – номер конечной вершины, и идентификатор дерева Tree_ID, к которому принадлежит данное ребро.
Было сформировано два дополнительных модуля – Types и Tools, в которых были описаны вводимые типы данных и вспомогательные процедуры и функции.
Модуль Types
interface
Type PListK = ^TListK; {dinamical structure for Kruskal Algorithm}
TListK = record {data}
weight, {weight}
point1, {pointA}
point2, {pointB}
Tree_ID: integer;{Tree Identificator}
left, {links}
right: PListK;
end;
PListPr = ^TListPr;{structure for Algorithm Prima}
TListPr = record {data}
weight, {weight}
point1,
point2, {ends points}
same: integer;{mark for elements in queue, 0-nothing common,
not 0 - index of the common point}
part: boolean;{mark for ribs - components of spanning tree}
left, {links}
right: PListPr;
end;
var f1, {input data file}
f2:text; {results file}
filename:string;{read from the command line}
n:integer; {number of Points in the Graph}
numRib:integer; {number of Ribs in spanning tree}
compscount: longint; {counters}
movescount: longint;
timescount: longint;
implementation
end.
В нем описана структура полей в записи списков для реализации алгоритмов Крускала и Прима, а также основные глобальные переменные.
Модуль Tools
unit Tools;
interface
uses Types, DOS;
function NowTimeIs:longint;
procedure ReadFileName;
procedure ErrMsg(Msg: string);
implementation
procedure ErrMsg(Msg: string);
begin
writeln(Msg);
readln;
halt;
end;
function NowTimeIs:longint;
const
c60: longint=60;
var
h, m, s, s100: word;
begin
gettime(h, m, s, s100);
nowtimeis:=((h*c60+m)*c60+s)*100+s100;
end;
procedure ReadFileName;
begin
if paramcount=0 then
begin
writeln('Використання: '+ paramstr(0)+ ' datafile');
writeln('datafile is *.txt file, with the structure:');
writeln('the first line contains only the number of points in Graph');
writeln('next lines contains information about Ribs in the Graph');
writeln('each line for another rib ');
writeln('in order: weight of the rib, start point, finish point');
readln;
halt;
end else begin
filename:=paramstr(1);
assign(f1, filename);
{$I-}
reset(f1);
close(f1);
if (IOResult<>0) or (paramcount>1) then ErrMsg('Невiрне використання!');
{$I+}
end;
end;
end.