/* 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); }
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); }
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); } }
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??? } }
// 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); }