コード例 #1
0
ファイル: dijkstra.c プロジェクト: artronics/Dijkstra
void dijkstra(graph* g, unsigned int source) {
	unsigned int u, v, edge_count;
	node *n, *d;
	edge *e;
	heap *Q;

	g->nodes[source].distance = 0;
	Q = heap_make(compare, g);

	while(!heap_is_empty(Q)) {
		u = heap_delete_min(Q);
		n = &g->nodes[u];
		edge_count = n->edge_count;
		for(v = 0; v < edge_count; v++) {	
			e = &n->edges[v];	
			d = &g->nodes[e->destination];
			if(d->distance > n->distance + e->weight) {
				/* 
					Relajo los vertices 
				*/			
				d->distance = n->distance + e->weight;
				/* 
					Actualizo el nodo con la distancia optima a este 
				*/
				d->previous = u;
				/* 
					Actualizo la cola de prioridad (el vertice solo puede 
				   haber subido en prioridad, entonces solo hago heapify-up 
				*/
				heap_heapify_up(Q, d->heap_index);				
			}
		}
	}
	heap_destroy(Q);
}
コード例 #2
0
ファイル: graph.c プロジェクト: 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;
}
コード例 #3
0
ファイル: finder-actor.cpp プロジェクト: jurgen-kluft/epyx
    void FinderActor::start(){
        lock();
        heap_make(shortlist);
        heap_make(foundPeers);

        //Initialize the shortlist and foundPeers
        std::vector<Peer::SPtr> nearest;
        n.kbucket.findNearestNodes(requestedId, nearest, countToFind);

        for(auto it = nearest.begin(); it != nearest.end(); it ++) {
            addToShortList(*it);
            addToFoundPeers(*it);
        }

        //Send queries to the nodes closest to the target
        for(auto i = shortlist.begin(); i != shortlist.end(); i++) {
            sendFindQueryTo((*i).second);
        }
        unlock();
    }
コード例 #4
0
ファイル: jgmalloc.c プロジェクト: jamesgolick/jgmalloc
void
heap_list_append(struct malloc_chunk **chunk) {
  if (heapListStart) {
    heapptr cur = heapListStart;
    do {
      if (cur->end + 1 == (void*)*chunk) {
	cur->end = (void*)*chunk + OVERHEAD + (*chunk)->size;
	return;
      }
    } while((cur = cur->next) != NULL);

    heapptr heap = heap_make(chunk);
    cur = heapListStart;
    while(cur->next != NULL) { cur = cur->next; }
    cur->next = heap;
    heap->prev = cur;
  } else {
    heapListStart = heap_make(chunk);
  }
}
コード例 #5
0
ファイル: code_base.c プロジェクト: aidanhs/teeterl
int code_base_load(code_base_t *self, named_tuples_t *nm_tuples,
	term_t module, term_t exports, term_t fun_table, term_t attrs, term_t preloaded, term_t misc)
{
	module_t *m;
	apr_pool_t *pool;
	
	apr_pool_create(&pool, 0);
	m = apr_palloc(pool, sizeof(*m));
	m->mod_pool = pool;
	m->literals = heap_make(pool);
	m->key.module = module;
	m->key.is_old = 0;
	m->code_size = 0;
	m->code = 0;
	m->exports = apr_hash_make(pool);
	m->nfuns = 0;
	m->funs = 0;
	m->files = 0;
	m->source = 0;

	if (preloaded != nil)
	{
		int i;
		int n = list_length(preloaded);
		term_t cons = preloaded;
		int ok = 1;
		m->code = apr_palloc(pool, n*sizeof(codel_t));
		m->code_size = n;
		i = 0;
		while (ok && is_cons(cons))
		{
			term_box_t *cbox = peel(cons);
			if (is_int(cbox->cons.head))
			{
				m->code[i].i = int_value(cbox->cons.head);
			}
			else if (is_tuple(cbox->cons.head))
			{
				term_box_t *tbox = peel(cbox->cons.head);
				if (tbox->tuple.size == 2)
				{
					term_t selector = tbox->tuple.elts[0];
					term_t value = tbox->tuple.elts[1];
					switch (selector)
					{
					case AT__:		// {'@',Offset}
						m->code[i].l = m->code + int_value(value);
						break;
					case A_T:		// {t,Literal}
						m->code[i].t = heap_marshal(value, m->literals);
						break;
					case A_B:
						m->code[i].bif = builtins[int_value(value)].entry;
						break;
					case A_N:		// {n,{N,F}}
						if (is_tuple(value))
						{
							term_box_t *vb = peel(value);
							if (vb->tuple.size == 2)
							{
								term_t name = vb->tuple.elts[0];
								term_t field = vb->tuple.elts[1];
								int index = named_tuples_set(nm_tuples, name, field);
								m->code[i].t = tag_int(index);
							}
							else
								ok = 0;
						}
						else
							ok = 0;
						break;
					default:
						ok = 0;
					}
				}
			}
			else if (is_bignum(cbox->cons.head))
			{
				mp_int mp = bignum_to_mp(cbox->cons.head);
                m->code[i].i = mp_get_int(&mp);
			}
			else
				ok = 0;

			i++;
			cons = cbox->cons.tail;
		}

		if (!ok)
		{
			apr_pool_destroy(pool);
			return 1;
		}
	}

	// misc:
	// source line info:
	// {file,Files}
	// {source,[{F,L,S,E}]}

	if (misc != nil)
	{
		term_t cons = misc;
		while (is_cons(cons))
		{
			term_box_t *cb = peel(cons);
			term_t t = cb->cons.head;
			if (is_tuple(t))
			{
				term_box_t *tb = peel(t);
				if (tb->tuple.size >= 2)
				{
					term_t selector = tb->tuple.elts[0];
					term_t info = tb->tuple.elts[1];
					switch (selector)
					{
					case A_FILES:
						m->files = source_files_names(info, pool);
						break;
					case A_SOURCE:
						m->source = source_line_blocks(info, pool);
						break;
					}
				}
			}
			cons = cb->cons.tail;
		}
	}

	if (fun_table != nil)
	{
		int i;
		int nfuns = list_length(fun_table);
		term_t cons = fun_table;
		int ok = 1;
		m->funs = apr_palloc(pool, nfuns*sizeof(fun_slot_t));
		m->nfuns = nfuns;
		for (i = 0; ok && i < nfuns; i++)
		{
			term_box_t *cbox = peel(cons);
			if (is_tuple(cbox->cons.head))
			{
				term_box_t *tbox = peel(cbox->cons.head);
				if (tbox->tuple.size == 2)
				{
					term_t uniq = tbox->tuple.elts[0];
					term_t offset = tbox->tuple.elts[1];
					if ((is_int(uniq) || is_bignum(uniq)) && is_int(offset))
					{
						fun_slot_t *slot = &m->funs[i];
						if (is_int(uniq))
							slot->uniq = int_value(uniq);
						else
						{
							mp_int mp = bignum_to_mp(uniq);
							slot->uniq = (uint)mp_get_int(&mp);
						}
						slot->entry = m->code + int_value(offset);
					}
					else
						ok = 0;

				}
				else
					ok = 0;
			}
			else
				ok = 0;

			cons = cbox->cons.tail;
		}

		if (!ok)
		{
			apr_pool_destroy(pool);
			return 1;
		}
	}

	//TODO: attrs ingnored

	if (exports != nil)
	{
		int ok = 1;
		term_t cons = exports;
		while (ok && is_cons(cons))
		{
			term_box_t *cbox = peel(cons);
			// {Function,Arity,Offset}
			if (is_tuple(cbox->cons.head))
			{
				term_box_t *tbox = peel(cbox->cons.head);
				if (tbox->tuple.size == 3)
				{
					term_t function = tbox->tuple.elts[0];
					term_t arity = tbox->tuple.elts[1];
					term_t offset = tbox->tuple.elts[2];
					if (is_atom(function) && is_int(arity) && is_int(offset))
					{
						export_t *exp = apr_palloc(pool, sizeof(*exp));
						exp->key.function = function;
						exp->key.arity = int_value(arity);
						exp->entry = m->code + int_value(offset);
						apr_hash_set(m->exports, &exp->key, sizeof(exp->key), exp);
					}
					else
						ok = 0;
				}
				else
					ok = 0;
			}
			else
				ok = 0;

			cons = cbox->cons.tail;
		}

		if (!ok)
		{
			apr_pool_destroy(pool);
			return 1;
		}
	}

	apr_hash_set(self->modules, &m->key, sizeof(m->key), m);
	return 0;
}