Sortowanie topologiczne

Z RNO-Wiki


Sortowanie topologiczne polega na ułożeniu wszystkich wierzchołków grafu w taki sposób, że jeśli graf zawiera krawędź z u do v, to w porządku podanym nam przez algorytm sortowania topologicznego u znajdzie się przed v. Oczywiście znalezienie takiego porządku nie jest możliwe w grafie posiadającym cykle. Do znajdowania porządku topologicznego wierzchołków będziemy używać algorytmu przeszukiwania grafu wgłąb. Skorzystamy z obserwacji, że jeśli jeśli DFS nie odwiedzi żadnego wierzchołka po odwiedzeniu wierzchołka x to znaczy, że x może być ostatni w porządku topologicznym.

W naszym algorytmie będziemy mieć procedurę TOPOLOGICAL-SORT( G), która dostanie acykliczny graf skierowany (dag) G i zwróci nam posortowaną topologicznie listę wierzchołków grafu G.


TOPOLOGICAL-SORT( G)
var
    Q   : lista wierzchołków;
    c   : integer; { kolor dla spójnych składowych G }
    color: array [1..n] of integer; { tablica z kolorowaniem }
begin
    Na początek Q ma być puste.
    Tablica color ma być wypełniona zerami.
    c1;
    for każdy v wierzchołek grafu G do begin
        if color[ v] <> 0 then begin 
            DFS( v, c );
            c ← c + 1;
        end;
    end;
   return Q;
end.
 
DFS( x, c)
begin
    color[ x] = c;
    for każdy sąsiad v wierzchołka x w grafie G do begin
        if color[ v] == 0 then
            DFS( v, c );
    end;
    Q.push-front( x);
end.

Osobiste