📄 mainunit.~pas
字号:
//head:=0;
// tail:=0;
pointer:=0;
judge:=true;
for i:=0 to MAX do
begin
middle[i].first:=0;
middle[i].second:=0;
end;
for i:=0 to MAXNODE do
for j:=0 to MAXNODE do
begin
cost[i][j]:=MAXCOST;
if i=j then cost[i][j]:=0;
end;
for i:=0 to stategrafh.Count-1 do
begin
p:=Pvertex_node(stategrafh.Items[i]).link;
while p<>nil do
begin
j:=p.nextnodenum;
cost[i][j]:=1;
p:=p.nextedge;
end;
end;
for i:=0 to stategrafh.Count-1 do
begin
dist[i]:=cost[findnumber('start')][i];
s[i]:=0;
end;
s[findnumber('start')]:=1;
i:=0;
for k:=0 to stategrafh.Count-1 do //...........................................
if findnumber('start')<>k then
begin
middle[i].first:= findnumber('start');
middle[i].second:=k;
i:=i+1;
end;
//v:= findnumber('start');
//path[tail]:=findnumber('start');
//tail:=tail+1;
for i:=0 to stategrafh.Count-1 do
begin
mindis:=MAXCOST;
for j:=0 to stategrafh.Count-1 do /////选到开始节点最小的边
begin
if(dist[j]<mindis )and (s[j]=0) then
begin
mindis:=dist[j];
u:=j;
end;
end;
s[u]:=1;
for k:=0 to (stategrafh.Count-i-1) do //................................
if middle[k].second=u then
begin
answer[pointer].first:=middle[k].first;
answer[pointer].second:=middle[k].second;
pointer:=pointer+1;
for l:=k to (stategrafh.Count-i-2) do
begin
middle[l].first:=middle[l+1].first;
middle[l].second:=middle[l+1].second;
end;
break;
end;
//path[tail]:=u;
//tail:=tail+1;
for j:=0 to stategrafh.Count-1 do ///////优化代选边表
begin
if(s[j]=0) then
begin
dis:=dist[u]+cost[u][j];
if dist[j]>dis then
begin
dist[j]:=dis;
l:=0;
while (middle[l].second<>j) and (l<MAX) do
l:=l+1;
if middle[l].second=j then
middle[l].first:=u;
end;
//dist[j]=dist[j]<dis ? dist[j]:dis;
end;
end;
end;
{while head<>tail do
begin
memo1.Lines.Add(Pvertex_node(stategrafh.items[path[head]]).vertexname);
memo1.Lines.Add('------->');
head:=head+1;
end; }
memo3.Lines.Add('◎◎◎◎◎◎◎◎◎◎最短路径计算◎◎◎◎◎◎◎◎◎◎');
for i:=0 to stategrafh.Count-1 do
begin
if i<>findnumber('start') then
begin
showmessage('输出开始节点(start)到节点'+Pvertex_node(stategrafh.Items[i]).vertexname+'的最短路径');
memo3.Lines.Add('start------->'+Pvertex_node(stategrafh.Items[i]).vertexname+':');
if dist[i]=MAXCOST then
memo3.Lines.Add('no path!')
else
memo3.Lines.Add(' cost= '+inttostr(dist[i]));
end ;
end;
memo3.Lines.Add('');
memo3.Lines.Add('%%%%%%%迪杰斯特拉算法执行后得到的边有:%%%%%%%');
for l:=0 to stategrafh.Count-2 do
memo3.Lines.Add(Pvertex_node(stategrafh.Items[answer[l].first]).vertexname+'--------'+findedge(answer[l].first,answer[l].second)+'-------->'+Pvertex_node(stategrafh.Items[answer[l].second]).vertexname);
end;
end;
procedure TForm1.stateCoverGrafhClick(Sender: TObject);
var
i,j,k,l:integer;
p:Pedge_node;
stack:array[0..MAX] of edge_pair;
top:integer;
aim:integer;
s:array[0..MAXNODE] of integer;
rrr,event:string;
covered:array[0..MAXNODE]of boolean;
begin
top:=0;
rrr:='';
event:='';
for i:=0 to MAXNODE do
begin
s[i]:=0;
covered[i]:=false;
if i>=stategrafh.Count then covered[i]:=true;
end;
if (stategrafh.Count>0) and (judge=true) then
begin
form2.Edit1.Text:='start';
form2.Show;
for i:=0 to stategrafh.Count-1 do
begin
form2.ComboBox1.Items.Add(Pvertex_node(stategrafh.items[i]).vertexname);
end;
for i:=0 to stategrafh.Count-1 do //输出开始节点到目标节点的最短路径
begin
if Pvertex_node(stategrafh.Items[i]).vertexname<>'start' then
begin
form2.Memo2.Lines.Add('******************************************');
form2.Memo2.Lines.Add('开始节点start到目标节点'+Pvertex_node(stategrafh.Items[i]).vertexname+'的路径为: ');
for j:=0 to stategrafh.Count-1 do //找到到目标节点的最后一条边,
begin
if (answer[j].second)=i then
begin
stack[top].first:= answer[j].first;
stack[top].second:= answer[j].second;
top:=top+1;
aim:=answer[j].first;
break;
end
else ;
end;
while stack[top-1].first<>findnumber('start') do //递归地往前搜索直到到达开始节点
for j:=0 to stategrafh.Count-1 do
if answer[j].second = aim then
begin
stack[top].first:= answer[j].first;
stack[top].second:= answer[j].second;
top:=top+1;
aim:= answer[j].first;
break;
end;
while top>0 do
begin
top:=top-1;
p:=Pvertex_node(stategrafh.Items[stack[top].first]).link;
while (p<>nil) and (p.nextnodenum<>stack[top].second) do
p:=p.nextedge;
if p.nextnodenum = stack[top].second then
event:=p.edgename
else showmessage('这条边不存在');
rrr:=Pvertex_node(stategrafh.Items[stack[top].first]).vertexname+'---------->'+Pvertex_node(stategrafh.Items[stack[top].second]).vertexname;
form2.Memo2.Lines.Add(rrr+' EVENT: '+event);
end;
//form2.Memo2.Lines.Add(rrr);
form2.Memo2.Lines.Add('');
end;
end;
////////////////////////////////////////
begin
top:=0;
rrr:='';
event:='';
l:=1;
i:=form1.findnumber('end');
if (Pvertex_node(stategrafh.Items[i]).vertexname<>'start') and (i<stategrafh.Count) then
begin
form2.Memo3.Lines.Add('******************************************');
form2.Memo3.Lines.Add('用例-1:');
for j:=0 to stategrafh.Count-1 do //找到到目标节点的最后一条边,
begin
if (answer[j].second)=i then
begin
covered[i]:=true;
stack[top].first:= answer[j].first;
stack[top].second:= answer[j].second;
top:=top+1;
aim:=answer[j].first;
break;
end
else ;
end;
while stack[top-1].first<>form1.findnumber('start') do //递归地往前搜索直到到达开始节点
for j:=0 to stategrafh.Count-1 do
if answer[j].second = aim then
begin
covered[aim]:=true;
stack[top].first:= answer[j].first;
stack[top].second:= answer[j].second;
top:=top+1;
aim:= answer[j].first;
break;
end;
covered[form1.findnumber('start')]:=true;
while top>0 do
begin
top:=top-1;
p:=Pvertex_node(stategrafh.Items[stack[top].first]).link;
while (p<>nil) and (p.nextnodenum<>stack[top].second) do
p:=p.nextedge;
if p.nextnodenum = stack[top].second then
event:=p.edgename
else showmessage('这条边不存在');
rrr:=Pvertex_node(stategrafh.Items[stack[top].first]).vertexname+'------>'+Pvertex_node(stategrafh.Items[stack[top].second]).vertexname ;
form2.Memo3.Lines.Add(rrr+' EVENT: '+event+' ');
// form2.Memo3.Lines.Add();
end;
//memo1.Clear;
//form2.Memo2.Lines.Add(rrr);
end;
for k:=0 to stategrafh.count-1 do
if covered[k] = false then
begin
l:=l+1;
top:=0;
rrr:='';
event:='';
i:=k;
if (Pvertex_node(stategrafh.Items[i]).vertexname<>'start') and (i<stategrafh.Count) then
begin
form2.Memo3.Lines.Add('******************************************');
form2.Memo3.Lines.Add('用例-'+inttostr(l)+':');
for j:=0 to stategrafh.Count-1 do //找到到目标节点的最后一条边,
begin
if (answer[j].second)=i then
begin
covered[i]:=true;
stack[top].first:= answer[j].first;
stack[top].second:= answer[j].second;
top:=top+1;
aim:=answer[j].first;
break;
end
else ;
end;
while stack[top-1].first<>form1.findnumber('start') do //递归地往前搜索直到到达开始节点
for j:=0 to stategrafh.Count-1 do
if answer[j].second = aim then
begin
covered[aim]:=true;
stack[top].first:= answer[j].first;
stack[top].second:= answer[j].second;
top:=top+1;
aim:= answer[j].first;
break;
end;
while top>0 do
begin
top:=top-1;
p:=Pvertex_node(stategrafh.Items[stack[top].first]).link;
while (p<>nil) and (p.nextnodenum<>stack[top].second) do
p:=p.nextedge;
if p.nextnodenum = stack[top].second then
event:=p.edgename
else showmessage('这条边不存在');
rrr:=Pvertex_node(stategrafh.Items[stack[top].first]).vertexname+'------>'+Pvertex_node(stategrafh.Items[stack[top].second]).vertexname+' EVENT: '+event+' ';
form2.Memo3.Lines.Add(rrr);
end;
//memo1.Clear;
//form2.Memo2.Lines.Add(rrr);
//form2.Memo3.Lines.Add(rrr);
end;
end;
end;
///////////////////////////////////////////////////////////////////
end
else showmessage('没有选择可供描述的状态图,请选择帮助,查看执行步骤?');
end;
procedure TForm1.N2Click(Sender: TObject);
begin
Form3.show;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -