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); } }
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 }
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; } }