Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Delphi - Ordinamento topologico
Forum - Delphi - Ordinamento topologico

Avatar
FranCich (Normal User)
Newbie


Messaggi: 9
Iscritto: 09/06/2008

Segnala al moderatore
Postato alle 14:29
Venerdì, 11/07/2008
Qual è il codice dell'ordinamento topologico?

Es: Ho questo grafo (rappresentato con l'array delle adiacenze):
0->2->3->nil
1->4->nil
2->1->5->nil
3->nil
4->5->nil
5->3->nil

Ordine topologico: {0, 2, 1, 4, 5, 3}.

L'algoritmo è questo:
- seleziono i nodi nel grafo che non hanno archi entranti
- cancello i loro archi uscenti e costruisco l'ordine dei nodi dell'ordinamento topologico
- L'algoritmo va ovviamente iterato fino a quando non verifico più la prima condizione.

Ma qual è il codice (o pseudocodice)?

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 19:28
Venerdì, 11/07/2008
Testo quotato


L ← Empty list where we put the sorted elements
Q ← Set of all nodes with no incoming edges
while Q is non-empty do
    remove a node n from Q
    insert n into L
    for each node m with an edge e from n to m do
        remove edge e from the graph
        if m has no other incoming edges then
            insert m into Q
if graph has edges then
    output error message (graph has a cycle)
else
    output message (proposed topologically sorted order: L)


Ultima modifica effettuata da pierotofy il 11/07/2008 alle 19:30


Il mio blog: https://piero.dev
PM Quote
Avatar
FranCich (Normal User)
Newbie


Messaggi: 9
Iscritto: 09/06/2008

Segnala al moderatore
Postato alle 17:32
Sabato, 12/07/2008
Ce l'ho fatta!!!
Ecco il codice:
Codice sorgente - presumibilmente Delphi

  1. procedure topological_sort(G:grafo);
  2.     var
  3.       col:colore;
  4.       dist,pred:vettore;
  5.       i,u:integer;
  6.       time:integer;
  7.       l:lista;
  8.     begin
  9.       l:=nil;
  10.       setlength(col,length(G));
  11.       setlength(dist,length(G));
  12.       setlength(pred,length(G));
  13.       time:=0;
  14.       for i:=0 to length(G)-1 do
  15.         begin
  16.           col[i]:='B';
  17.           dist[i]:=-1;
  18.           pred[i]:=-1;
  19.         end;
  20.       for u:=0 to length(G)-1 do
  21.         begin
  22.           if col[u]='B' then
  23.             DFS_topological(G,u,l,col,time,dist,pred);
  24.         end;
  25.         stampa(l);
  26.     end;
  27.  
  28.  
  29.   procedure DFS_topological(G:grafo; s:integer; var L:lista; var col:colore; var time:integer; var dist:vettore; var pred:vettore);
  30.     begin
  31.       col[s]:='G';
  32.       time:=time+1;
  33.       dist[s]:=time;
  34.       while g[s]<>nil do
  35.         begin
  36.           if (col[g[s]^.inf]='B') then
  37.             begin
  38.               pred[g[s]^.inf]:=s;
  39.               DFS_topological(G,g[s]^.inf,L,col,time,dist,pred);
  40.             end;
  41.           g[s]:=g[s]^.next;
  42.         end;
  43.       col[s]:='N';
  44.       time:=time+1;
  45.       dist[s]:=time;
  46.       ins_testa(L,s);
  47.     end;


Ultima modifica effettuata da FranCich il 12/07/2008 alle 17:34
PM Quote
Avatar
inuyasca (Ex-Member)
Newbie


Messaggi: 20
Iscritto: 09/03/2008

Segnala al moderatore
Postato alle 21:19
Giovedì, 07/08/2008
Davvero interessante questa procedura l'ho letta l'ho capita ma non ho mai usato quell'istruzione a occhio e croce dal'istruzione DFS_topological() e dalle fariabili settate cosi a a che vedere con la grafica ma in definitiva quando passi quelle informazioni perfino di tipo timer cosa dovrebbe produre quell'istruzione DFS.... ecc??? se tiro a indovinare è un filtro su un'immagine sparandola dovrebbe modificare un'immagine ma potrei sbagliarmi :-o

PM Quote
Avatar
FranCich (Normal User)
Newbie


Messaggi: 9
Iscritto: 09/06/2008

Segnala al moderatore
Postato alle 19:36
Lunedì, 11/08/2008
Testo quotato

Postato originariamente da inuyasca:

a occhio e croce dal'istruzione DFS_topological() e dalle fariabili settate cosi a a che vedere con la grafica ma in definitiva quando passi quelle informazioni perfino di tipo timer cosa dovrebbe produre quell'istruzione DFS.... ecc??? se tiro a indovinare è un filtro su un'immagine sparandola dovrebbe modificare un'immagine ma potrei sbagliarmi :-o  



No... non centra niente la grafica. Semplicemente va visitando il grafo ed una volta che il colore di un nodo visitato è nero ('N', ovvero è stato visitato e non ha più nodi adiacenti da visitare) viene inserito in testa ad una lista. In fine verrà stampata la lista (stampa(l) ovviamente non è una procedura di libreria del delphi)... ed ecco l'ordinamento topologico!!!

Ultima modifica effettuata da FranCich il 11/08/2008 alle 19:38
PM Quote