, , . , . . , .
, . , . , . .
. , .
, .
, :
1. .
2. .
3. .
"-". , .
. , . , . , . , ( ).
, :
1. .
2. .
3. .
Visited TNode:
TNode=record
ID:integer; //
LinkSentinel:TLink; // ,
NextNode:PNode; //
Visited:boolean; //
end;
, , . .
procedure Traverse(node: PNode);
var
link: PLink;
neighbor: PNode;
begin
// .
Node^.Visited:= True;
// .
link:= node^.LinkSentinel.NextLink;
while (link<>nil) do
begin
// .
if (link^.Node1 = node) then neighbor:= link^.Node2
else neighbor:= link^.Nodel;
// ,
|
|
if (not neighbor^.Visited) then Traverse(neighbor);
//
Link:=link^.NextLink;
end;
end;
, . . , , . . 34 . .
. 34.
, . , . , , . , .
, , . , , , .
:
1. ( ) .
2. , :
- ;
- .
, , , . , .
, , . , . , . . 35 , . .
. 35. ,
, . . . , , . . , .
, , . , , .
. 36 , . . , F , , , F
|
|
. 36.
, . , .
, . . , .
, , . , . . . , , .
. TNode Dist, . Dist True, . Dist , .
TNode Status, , . InLink , .
type
TStatus=(nsNotInList, nsWasInList, nsNowInList);
TNode=record
ID:integer; //
LinkSentinel:TLink; // ,
NextNode:PNode; //
Status:TStatus; //
Dist:integer; //
InLink:PLink; // ,
end;
TLink InTree, , .
type
TLink=record
Node1: PNode; //
Node2: PNode; //
Cost:integer; //
NextLink:PLink; //
InTree:boolean; //
end;
, , , - . , . , , .
Status nsNotInList Dist INFINITY, . Dist 0 . Status nsNowInList - , .
Dist. , .
Status nsWasInList, . Dist InLink . InLink nil, Dist- .
, . , . Status nsNowInList, Dist - . , InLink , .
|
|
, , Status nsNowInList, . Dist , , . , InLink Dist . , , , .
. 37 . , . , , D . InLink . , InLink .
. 37.
, InLink Dist Status = nsNowInList. , , . , , , . , . . 38 , , .
. 38.