inline long long int heap_pop(void) { long long int res = compute(1); -- count[MAX_NUMBER + heap[1] - size - 1]; heap_fix(); return res; }
int * dijkstra(graph g, int from, int*tree, int (*add)(int, int)){ int * somme, i, act;/*Commistione linguistica che bonato ama! xD*/ heap_t *heap; somme = malloc(sizeof(int) * g->v); assert(somme != NULL); /*Piazzo tutto a -1 che in binario è 11111111....1111 ... fino alla nausea... 1111*/ memset(somme, 0xff, g->v * sizeof(int)); /*Good! Ora però la prima va a 0!*/ somme[from] = 0; /*Ci siamo quasi...*/ /*ora le heap!*/ heap = heap_make(somme, g->v, heapcmp, sizeof(int)); /*Metto a TRUE la flag *connected*/ g->connesso = 1; /*Ultimissima cosa: inizializzo l'albero delle visite ad una foresta di alberi di un solo elemento*/ for(i = 0; i < g->v; i++) tree[i] = i; /* Ora il ciclo, prepariamo l'assorbente xD*/ while(!heap_is_empty(heap)){ /* Estraggo il primo elemento*/ from = heap_extract(heap); /* Se la distanza per arrivare è ancora infinita (-1), significa che questa parte del * Grafo non è mai stata raggiunta da nessun arco e quindi è disconnessa dalla componente * In cui è presente il nodo di partenza, e quindi, visto che questo è il massimo possibili * tutti gli altri elementi nella heap avranno lo stesso valore, quindi interrompo qui * l'esecuzione */ if(somme[from] == -1) { g->connesso = 0;/* Segno che il grafo non è connesso*/ /*interrompo il ciclo*/ break; } /*E itero tra tutto */ for(i = 0; i < g->v; i++){ if(g->adj[from][i]){ /*Mi calcolo la distanza attuale + quella dell'arco tramite una funzione esterna*/ act = add(somme[from], g->adj[from][i]); /*Se la somma è a -1 (non è ancora stato aggiornato) oppure il nuovo valore e' inferiore a quello vecchio, lo metto uguale e aggiorno l'albero delle visite*/ if(somme[i] == -1 || somme[i] > act){ somme[i] = act; tree[i] = from; /*Ho aggiornato: devo fare un fix della heap che potrebbe essere andata a farsi fottere!*/ heap_fix(heap, i); } } } } heap_free(heap);/*Questa non mi cancella l'array somme, quindi sono contento xD*/ /*Bene! abbiamo finito! :)*/ return somme; }