Exemplo n.º 1
0
static	int	inc_key(maxHeap* hp,int i,g3Float k)
{
	if (k < hp->heap[i].key) {
		fprintf(stderr,"New key error in inc_key(mheap)\n");
		hp->state = HP_INVALID;
		return 0;
	}
	hp->heap[i].key = k;
	while((i > 0) && (hp->heap[mh_parent(i)].key < hp->heap[i].key)) {
		swap_elem(&(hp->heap[mh_parent(i)]),&(hp->heap[i]));
		i = mh_parent(i);
	}
	return 1;
}
Exemplo n.º 2
0
void merge_nodes(int **adj_list, int *lengths, int adj_list_len, int node_1, int node_2)
{
  int node_1_len;
  adj_list[node_1] = realloc(adj_list[node_1], (lengths[node_1] + lengths[node_2]) * sizeof(*adj_list[node_1]));
  if(adj_list[node_1] != NULL)
  {
    node_1_len = lengths[node_1];
    lengths[node_1] += lengths[node_2];
  }
  else
    errorp("realloc, adj_list[node_1]");

  /* copy connections from node_2 to node_1 */
  int i;
  for(i = 0; i < lengths[node_2]; ++i)
    adj_list[node_1][node_1_len + i] = adj_list[node_2][i];

  /* remove node_2  */
  adj_list[node_2] = realloc(adj_list[node_2], 0);
  lengths[node_2] = 0;

  /* remove self loops */
  for(i = 0; i < lengths[node_1]; ++i)
    if(adj_list[node_1][i] == node_1 || adj_list[node_1][i] == node_2)
    {
      while(adj_list[node_1][ lengths[node_1] - 1 ] == node_1 || adj_list[node_1][ lengths[node_1] - 1 ] == node_2)
  	--lengths[node_1];

      if(lengths[node_1] <= i)
  	break;
      
      swap_elem(adj_list[node_1], i, lengths[node_1] - 1);
      --lengths[node_1];
    }

  adj_list[node_1] = realloc(adj_list[node_1], lengths[node_1] * sizeof(*adj_list[node_1]));
  if(adj_list[node_1] == NULL)
    errorp("realloc, adj_list[node_1]");
  
  /* replace connections to node_2 to node_1 */
  int j;
  for(i = 0; i < adj_list_len; ++i)
    if(i != node_1 && i != node_2)
      for(j = 0; j < lengths[i]; ++j)
	if(adj_list[i][j] == node_2)
	  adj_list[i][j] = node_1;
}
Exemplo n.º 3
0
void	mheap_sort(maxHeap* hp)
{
	int i,sz;

	if (hp->state == HP_SORTED) 
		return;
	if (hp->state != HP_BUILD)
		mheap_build(hp);
	sz = hp->size;
	for(i=(hp->size-1);i>0;i--) {
		swap_elem(&(hp->heap[0]),&(hp->heap[i]));
		hp->size--;
		heapify(hp,0);
	}
	hp->size = sz;
	hp->state = HP_SORTED;
}
Exemplo n.º 4
0
static	void	heapify(maxHeap* hp,int i)
{
	int	l,r,m;

	l = mh_left(i);
	r = mh_right(i);
	if ((l < hp->size) && (hp->heap[l].key > hp->heap[i].key)) 
		m = l;
	else
		m = i;
	if ((r < hp->size) && (hp->heap[m].key < hp->heap[r].key))
		m = r;
	if (m != i) {
		swap_elem(&(hp->heap[m]),&(hp->heap[i]));
		heapify(hp,m);
	}
}