unit Unit2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids, StdCtrls; type TForm2 = class(TForm) StringGrid1: TStringGrid; StringGrid2: TStringGrid; Label1: TLabel; Label2: TLabel; procedure FormActivate(Sender: TObject); private { Private declarations } public { Public declarations } end; type chain=array[1..3] of integer; type graph=array of chain; type graphs_arr=array of graph; //тип массива всевозможных графов type apc= array[1..30,1..30,0..30] of boolean; //тип массива всевозможных связей type Pnode=^node; //структура переменной node(расписание) node = record name:string; city_from:string; city_to:string; time_ot:real; time_pr:real; end; var Form2: TForm2; node_arr:array[1..30] of node; //массив всех рейсов (в нашем случае 30 штук) all_possible_connections: apc; //массив всех возможных соединений. //каждая его точка соотвествует //тройке(двойке) соединённых узлов графа //номера которых равны индескам данного элемента all_possible_graphs:graphs_arr; //массив всевозможных графов old_graph:graph; implementation {$R *.dfm} function sum_time_zad(my_graph:graph):real; //функция возвращает суммарное время задержки для данного графа var i,j:integer; sum:real; begin i:=0; sum:=0; while (i<=(length(my_graph)-1)) do begin if (my_graph[i][3]=0) then begin sum:=sum+node_arr[my_graph[i][2]].time_ot-node_arr[my_graph[i][1]].time_pr; end else begin sum:=sum+node_arr[my_graph[i][2]].time_ot-node_arr[my_graph[i][1]].time_pr+node_arr[my_graph[i][3]].time_ot-node_arr[my_graph[i][2]].time_pr; end; inc(i); end; sum_time_zad:=sum; //вывод самой функции end; procedure TForm2.FormActivate(Sender: TObject); var i,j,k,i1,mini:integer; min:real; begin stringgrid1.RowCount:=1; stringgrid2.RowCount:=1; //Выводим все возможные связки stringgrid2.Cells[0,0]:='узел 1'; stringgrid2.Cells[1,0]:='узел 2'; stringgrid2.Cells[2,0]:='узел 3'; i:=1; i1:=0; while (i<=30) do begin j:=1; while (j<=30) do begin k:=0; while (k<=30) do begin if (all_possible_connections[i,j,k]=true) then begin inc(i1); if (stringgrid1.RowCount0 then stringgrid2.Cells[2,i1]:=node_arr[k].name; end; inc(k); end; inc(j); end; inc(i); end; //ищем граф с минимальным суммарным временем, //которые бригады теряют на ожидании рейса i:=2; if length(all_possible_graphs)=0 then exit; min:=sum_time_zad(all_possible_graphs[1]); mini:=0; while (i<=(length(all_possible_graphs)-1)) do begin if (min>sum_time_zad(all_possible_graphs[i])) then begin min:=sum_time_zad(all_possible_graphs[i]); mini:=i; end; inc(i); end; //выводим в каких городах живут бригады showmessage('Минимальное время суммарной задержки всех бригад графа - '+FloatToStr(min)); stringgrid1.Cells[0,0]:='Номер бригады'; stringgrid1.Cells[1,0]:='Город бригады'; stringgrid1.Cells[2,0]:='Обслуживаемые рейсы'; i:=0; while (i<=(length(all_possible_graphs[mini])-1)) do begin if (stringgrid1.RowCount<(i+2)) then stringgrid1.RowCount:=stringgrid1.RowCount+1; stringgrid1.Cells[1,i+1]:=node_arr[all_possible_graphs[mini][i][1]].city_from; stringgrid1.Cells[0,i+1]:=IntToStr(i+1); if (all_possible_graphs[mini][i][1]<>0) then stringgrid1.Cells[2,i+1]:=node_arr[all_possible_graphs[mini][i][1]].name+' - '+node_arr[all_possible_graphs[mini][i][2]].name+' - '+node_arr[all_possible_graphs[mini][i][3]].name else stringgrid1.Cells[2,i+1]:=node_arr[all_possible_graphs[mini][i][1]].name+' - '+node_arr[all_possible_graphs[mini][i][2]].name; inc(i); end; end; end.