Esempio n. 1
0
inline long long int heap_pop(void)
{
    long long int res = compute(1);
    -- count[MAX_NUMBER + heap[1] - size - 1];
    heap_fix();
    return res;
}
Esempio n. 2
0
File: graph.c Progetto: marco6/poli
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;
}