Example #1
0
/* Compute TSP for the tree t -- use conquer for problems <= sz */
Tree tsp(Tree t,int sz,int nproc) {
  Tree left,right;
  Tree leftval;
#ifdef FUTURES
  future_cell_pointer fc;
#endif
  Tree rightval;
  int nproc_2 = nproc/2;

  if (t->sz <= sz) return conquer(t);

  left = t->left; right = t->right;
#ifndef FUTURES
  leftval = tsp(left,sz,nproc_2);
#else
  FUTURE(left,sz,nproc_2,tsp,&fc);
#endif
  rightval = tsp(right,sz,nproc_2);
#ifdef FUTURES
  leftval = (Tree) TOUCH(&fc);
  leftval = (Tree) fc.value;
  return merge(leftval,rightval,t,nproc);
#else
  return merge(leftval,rightval,t,nproc);
#endif
}
void divide(int start,int end){
    int mid=(start+end)/2;
    if(start<end){
        divide(start,mid);
        divide(mid+1,end);
    }
    printf("start: %d, mid: %d, end: %d\n",start,mid,end);
    conquer(start,mid,end);
}
Example #3
0
void Node::sort(vector<int>& numbers)
{
  //printf("%d recebeu %lu números\n", rank, numbers.size());
  // se o tamanho do vetor atende ao critério de conquista...
  if (canConquer(numbers))
    conquer(numbers);
  else if(conquer_local_size == 0)
    divide_v1(numbers);
  else
    divide_v2(numbers);
}
Example #4
0
void divide(int array[], int low, int high)
{
	if(low<high)
	{
		int mid = (low+high)/2;

		divide(array, low, mid);
		divide(array, (mid+1), high);

		conquer(array, low, mid, high);
	}
}
Example #5
0
 blobsfront.c
   main(){
     //CORE
     //Faltan el menu y todo eso
     if ((command = pedirMov(player)) != null) {
       blobCount[player] += move(player, command); //devuelve 1 si divide
       conquer(player, command, blobCount);
       render(tablero, dimx, dimy);
     }
     else {
       // Termino el juego, sumar espacios al ganador
       // y mostrar shit
       // Vuelve al menu???
     }
   }
Example #6
0
// pega um percentual do vetor para si e o restante distribui entre os filhos
void Node::divide_v2(vector<int>& numbers)
{
  //printf("%d vai dividir %lu números\n", rank, numbers.size());
  // calcula o rank do filho à esquerda
  const int left_rank  = rank * 2 + 1;
  // calcula o rank do filho à direita
  const int right_rank = rank * 2 + 2;

  vector<int> meu(numbers.begin(), numbers.begin() + conquer_local_size + 1);
  vector<int> resto(numbers.begin() + conquer_local_size + 1, numbers.end());
  

  // printf("%d pegou %lu números para si e sobraram %lu\n", rank, meu.size(), resto.size());

  // calcula a posição da metade do vetor
  const size_t half_size = resto.size() / 2;

  // cria dois vetores com cada metade do vetor original
  vector<int> left(resto.begin(), resto.begin() + half_size);
  vector<int> right(resto.begin() + half_size, resto.end());

  // printf("%d vai enviar %lu números para %d e %lu para %d\n", rank, left.size(), left_rank, right.size(), right_rank);

  // envia os vetores para os nodos filhos
  sendToNode(left_rank, left);
  sendToNode(right_rank, right);

  
  conquer(meu);
  

  // espera um retorno dos nodos filhos
  receiveFromNode(left_rank, left);
  receiveFromNode(right_rank, right);

  // mescla os retornos dos nodos filhos no vetor original
  mergeVectors(left, right, resto);

  // mescla o meu com o novo resto
 
  mergeVectors(meu, resto, numbers);
  
}