|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 | |
|
Senior Member
Iscritto dal: Sep 2008
Città: Messina
Messaggi: 991
|
[C] Grafi: ritorna tutti i cammini semplici
Un compito d'esame presenta questo quesito:
Quote:
Codice:
void pathsearch (struct graph *ADJ[], int DIM, int a, int b, struct lista *L, int *visited[], int *trovato) {
struct graph *temp;
visited[a] = 1;
insTail (L,a);
if (a==b) {
*trovato = 1;
return;
}
for (temp=ADJ[a]; temp!=NULL; temp=temp->next)
if (!visited[temp->v])
pathsearch (ADJ, V, a, b, L, visited, trovato);
if (!(*trovato)) {
delTail (L);
visited[a] = 0;
}
}
Avevo pensato bastasse aggiungere un IF dopo l'ultimo che, alternativamente ad esso, non eliminasse l'elemento dalla coda ma non mi convince. Suggerimenti?!
__________________
PC/HTPC: Mac Mini 3,1 late 2009 | My Book Studio 2TB | LG M237WD monitor/tv | Logitech Z4 | Apple Magic Mouse | Apple Wireless Keyboard | Apple Remote Mobile: Samsung Galaxy Wonder i8150 cm9 Ultima modifica di -hide- : 11-03-2011 alle 10:37. |
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
|
Codice:
if (!(*trovato)) {
delTail (L);
visited[a] = 0;
}
comunque anche così dovrebbe terminare l'algoritmo per il resto, mi sembra corretto, cos'ha che non va? |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Sep 2008
Città: Messina
Messaggi: 991
|
Quote:
Ma questo non è il modo per ottenere uno ed un solo cammino a -> b?! Io li vorrei avere tutti, quindi il codice mi deve permettere di tornare indietro e controllare se ci sono altre vie. Con questo codice, appena arrivo a b chiude!
__________________
PC/HTPC: Mac Mini 3,1 late 2009 | My Book Studio 2TB | LG M237WD monitor/tv | Logitech Z4 | Apple Magic Mouse | Apple Wireless Keyboard | Apple Remote Mobile: Samsung Galaxy Wonder i8150 cm9 |
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
|
non è vero che arrivi a b e chiude
se avessi Codice:
return pathsearch (ADJ, V, a, b, L, visited, trovato); invece una volta fatto il primo return torna all'ultimo vertice (chiamiamolo v) che ti ha condotto effettivamente a b e continua a ciclare in cerca di un altro cammino che ti conduce a b ps: sulla storia di togliere il flag hai ragione tu |
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Sep 2008
Città: Messina
Messaggi: 991
|
Quote:
Ora non posso ma credo che nella giornata di domani scannerizzo il mio lavoro e te lo faccio vedere per conferma perché parlare così diventa molto difficile
__________________
PC/HTPC: Mac Mini 3,1 late 2009 | My Book Studio 2TB | LG M237WD monitor/tv | Logitech Z4 | Apple Magic Mouse | Apple Wireless Keyboard | Apple Remote Mobile: Samsung Galaxy Wonder i8150 cm9 |
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
|
sì in realtà dovresti ritornare solo se *trovato == 1 per fare quella cosa che dici (cioè ritornare appena lo trovi), sennò continui a visitare il grafo
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Sep 2008
Città: Messina
Messaggi: 991
|
Ho appena terminato di lavorare sul codice inerente la ricerca di un solo cammino. Credo di aver trovato l'aggiunta vincente; la trovi in grassetto nel codice stesso.
Codice:
void pathsearch (struct graph *ADJ[], int DIM, int a, int b, struct lista *L, int *visited[], int *trovato) {
struct graph *temp;
visited[a] = 1;
insTail (L,a);
if (a==b) {
*trovato = 1;
return;
}
for (temp=ADJ[a]; temp!=NULL && !(*trovato); temp=temp->next)
if (!visited[temp->v])
pathsearch (ADJ, V, a, b, L, visited, trovato);
if (!(*trovato)) {
delTail (L);
visited[a] = 0;
}
}
Provo a risolvere il problema dei più percorsi.
__________________
PC/HTPC: Mac Mini 3,1 late 2009 | My Book Studio 2TB | LG M237WD monitor/tv | Logitech Z4 | Apple Magic Mouse | Apple Wireless Keyboard | Apple Remote Mobile: Samsung Galaxy Wonder i8150 cm9 Ultima modifica di -hide- : 11-03-2011 alle 10:38. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 17:17.




















