Topological sort: Difference between revisions
Content added Content deleted
m (→Depth-first search: cosmetic) |
|||
Line 5,459: | Line 5,459: | ||
if not TryGetValue(s, Result) then |
if not TryGetValue(s, Result) then |
||
Result := nil; |
Result := nil; |
||
⚫ | |||
procedure Reverse(var a: array of string); |
|||
var |
|||
I, J: SizeInt; |
|||
t: string; |
|||
begin |
|||
I := 0; |
|||
J := High(a); |
|||
while I < J do begin |
|||
t := a[I]; |
|||
a[I] := a[J]; |
|||
a[J] := t; |
|||
Inc(I); |
|||
Dec(J); |
|||
⚫ | |||
end; |
end; |
||
function TDigraph.TryToposort(out aOutSeq: TStringArray): Boolean; |
function TDigraph.TryToposort(out aOutSeq: TStringArray): Boolean; |
||
var |
var |
||
Parents: TDictionary<string, string>;// stores the traversal tree as pairs |
Parents: TDictionary<string, string>;// stores the traversal tree as pairs (Node, its predecessor) |
||
⚫ | |||
// (Key: Node, Value: its predecessor) |
|||
⚫ | |||
⚫ | |||
with TList<string>.Create do begin |
|||
var |
|||
Add(Prev); |
|||
⚫ | |||
begin // just walk backwards through the traversal tree, |
|||
⚫ | |||
⚫ | |||
Add(Prev); |
|||
until Prev = BackPoint; |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
aOutSeq := ToArray; |
|||
Free; |
|||
⚫ | |||
aOutSeq[I] := Prev; |
|||
⚫ | |||
⚫ | |||
end; |
|||
var |
var |
||
Visited, // set of already visited nodes |
Visited, // set of already visited nodes |
||
Line 5,510: | Line 5,493: | ||
end else |
end else |
||
if not Closed.Contains(Next) then begin//back edge found(i.e. cycle) |
if not Closed.Contains(Next) then begin//back edge found(i.e. cycle) |
||
ExtractCycle(Next, aNode); |
ExtractCycle(Next, aNode); |
||
exit(False); |
exit(False); |
||
end; |
end; |