Beispiel #1
-1
void crear_monticulo(int v[], int n, monticulo *m) {
	int i = 0;
	int tamMont = 0;
	copiarVectorAMonticulo(v, n, m);
	(*m).ultimo = n;
	tamMont = (*m).ultimo;
	for (i = tamMont / 2; i >= 0; i--) {
		hundir(m, i);
	}
}
Beispiel #2
-1
int find_paths(int** costs,int start, int cant_nodos,int end) //-1 representa a infinito
{
	struct temp_node nodes[cant_nodos];
	int act; // nodo activo (ultimo nodo correcto)
			 // el heap es [0..act-1]
			 // nodos correctos [act..cant_nodos-1]
	int i;

	//los nodos correctos van al final

	for(i=0;i<cant_nodos;++i)
	{
		nodes[i].nodenum = i;
		nodes[i].val = INF;
	}

	nodes[start].val = 0;

	swapnodes(&nodes[start],&nodes[cant_nodos-1]);
	act=cant_nodos-1;

	while((act>0) && (nodes[act].nodenum != end) && (nodes[act].val != INF))
	{
		for(i=0;i<act;++i)
		{
			//esta comparacion se hace cant_nodos^2 veces
			if(costs[nodes[act].nodenum][nodes[i].nodenum] == INF)
			{
				continue;
			}

			if(menor(nodes[act].val + costs[nodes[act].nodenum][nodes[i].nodenum],nodes[i].val))
			{
				//actualizo distancia
				nodes[i].val = nodes[act].val + costs[nodes[act].nodenum][nodes[i].nodenum];

				//mantengo el heap (floto)
				flotar(nodes,i);
			}
		}

		swapnodes(&nodes[0],&nodes[act-1]); //extraigo el minimo
		act--;
		//hundo
		hundir(nodes,act,0);
	}

	return nodes[act].val; // si el bucle termino por nodes[act].nodenum==end tenemos el costo
						   // si termino por llegar a un valor INF debe ser el costo tambien INF
						   // ya que solo pueden quedar vertices con valor INF
}
Beispiel #3
-1
int eliminar_mayor(monticulo *m) {
	int x;

	if (monticulo_vacio(m)) {
		printf("Monticulo Vacio\n");
		exit(EXIT_FAILURE);
	} else {
		x = m->vector[0];
		m->vector[0] = m->vector[m->ultimo - 1];
		m->ultimo = (m->ultimo) - 1;
		if (m->ultimo > 0) {
			hundir(m, 0);
		}
		return x;
	}
}