Grafo pesato direzionale implementato con dizionario

di il
4 risposte

Grafo pesato direzionale implementato con dizionario

Salve a tutti.
vorrei porvi un problema un po' complicato.
sto realizzando un grafo tramite un dizionario,dove ogni nodo del dizionario deve contenere la sua lista di adiacenti,ogni adiacente dovra contenere la chiave per accedere al dizionario e recuperare le informazioni sui nodi adiacente appunto.

il problema e che dopo aver fatto i seguenti passi:
1)inserimento nodi -funzionante
2)controllo esistenza nodi - funzionante

provo ad unire con un arco due nodi.
questa funzione dovrebbe avere lo scopo di inserire nella lista di adiacenti di un nodo,un nuovo adiacente che conterra la chiave per accedere al dizionario e cercare appunto il nodo adiacente.
la chiave è univoca per ogni nodo.

il problema è che, quando recupero un nodo in questo modo..
dizionario->recupera(nodo a)->recuperalistaadiacenti()
e a questa lista faccio un inserimento....tutte le liste di adiacenti di tutti i nodi subiscono l'inserimento,come se fossero la stessa lista.
per esempio se collego A con B e B con C A risulterà collegata con C e se stessa e persino C sarà collegata con se stessa e A.

posto un immagine come schema,non ho usato i tag img che è un po grande in modo da leggere bene le scritte.

volevo sapere se qualcuno ha mai avuto questi problemi.o simili.
io dopo 2 giorni,passando 6 ore al giorno al computer,provando passaggi per puntatori anziche per valore, e ricontrollando il programma,tante volte, non sono riusito a risolvere.

in ogni caso,ogni struttura dai nodi alle liste,al dizionario e grafo è realizzata con template.

4 Risposte

  • Re: Grafo pesato direzionale implementato con dizionario

    Posta qualche codice cosi da capire cosa c'è che non va. Ho postato in un link tempo fà una soluzione (banale non con template o STL) ma funzionante. Prova a vedere se riesci a ricavare qualcosa.
  • Re: Grafo pesato direzionale implementato con dizionario

    Il fatto e che il codice è molto grande,sono 10 classi! non ho idea di come fare a postare una mole di codice del genere.
    potrei al massimo linkarvi un rar,non voglio naturalmente che mi facciate il programma,anche perche il programma suppongo che logicamente dovrebbe funzionare...il problema e che ci deve essere qualche magagna del c++ che nn conosco. non riesco a capire come e possibile che prendendo un nodo da una lista all'interno di un dizionario,dove questo nodo contiene un altra lista e modificando quest'ultima,tutte le liste all'nterno dei nodi,all'interno delle liste che sn dentro al dizionario,subiscano la stessa modifica.
  • Re: Grafo pesato direzionale implementato con dizionario

    Il punto è che senza vedere il codice uno non può dare neanche consigli. non dico di postare tutto ma di fare un esempio semplice che rappresenta il problema. Non sappiamo neanche com'è la tu a struttura dati. Parli di dizionario ma per me il dizionario è o una std::map, o un std::unordered_map. Parli di vettore di liste e mi viene in mente un std::vector<std::map> >. Poi mi perdo perche non ho il codice sotto mano.
  • Re: Grafo pesato direzionale implementato con dizionario

    Scusate la risposta tarda,ma ho risolto il problema...
    come al solito era una gran cavolata.
    purtroppo le magagne del c,le puoi evitare solo dopo averle conosciute XD.

    descrivo un esempio per aiutare chi come me riscontrasse tale problema un giorno.

    io ho la calsse
    nodo1{
    private:
    nodo2 n2;
    }
    a sua volta nodo2 {
    private:
    lista<nodo3> ln3; la lista e con template.
    }
    io pensavo che dichiarando una variabile di tipo nodo1.
    il c avrebbe creato in automatico all'interno di nodo1,la variabile di tipo nodo2 e di conseguenza
    la lista di tipo nodo3.
    infatti e cosi, con un piccolo problema,sembra quasi che il c per la lista,nonostante il costruttore che specifichi di creare un new lista di tipo nodo3.
    crei una lista fittizia che utilizza per ogni occorrenza di nodo2.
    ho risolto,dichiarando esplicitamente la lista a un livello superiore e passandogliela come parametro di una funzione membro setlista.
    forse il problema non era nuovo(non sono un mago della programmazione),e forse la mia non è una soluzione impeccabile.
    ma volevo avvisare sperando che nessuno debba mai piu sbatterci la testa XD.
Devi accedere o registrarti per scrivere nel forum
4 risposte