Ejemplo n.º 1
0
int main(int argc, char** argv)
{
	int i, j;
	int numeroDeVizinhos;
	int myRank;
	int source;
	int tag = 50;
	int pai[numeroDeTarefas];
	int contador[numeroDeTarefas];
	int reached[numeroDeTarefas];
	int id;
	int origem;
	MPI_Status status;

	MPI_Init (&argc, &argv);
	MPI_Comm_rank(MPI_COMM_WORLD, &myRank);

	numeroDeVizinhos = contaNumeroDeVizinhos(myRank);

	for (i=0; i<numeroDeTarefas; i++)
	{
		pai[i] = 0;
		contador[i] = 0;
		reached[i] = 0;
	}
	reached[myRank] = 1;

	for (i=0; i<numeroDeTarefas; i++)
	{
		if(matrizVizinhanca[myRank][i] == 1)
			MPI_Send(&myRank, 1, MPI_INT, i, tag, MPI_COMM_WORLD);
	}

	while (!finaliza(contador, numeroDeVizinhos, myRank))
	{
		MPI_Recv(&id, 1, MPI_INT, MPI_ANY_SOURCE, tag, MPI_COMM_WORLD, &status);
		origem = status.MPI_SOURCE;
		contador[id]++;
		if(reached[id]==0)
		{
			reached[id]=1;
			pai[id]=origem;
			for(j=0; j<numeroDeTarefas; j++)
				if(matrizVizinhanca[myRank][j]==1 && j!=pai[id])
					MPI_Send(&id, 1, MPI_INT, j, tag, MPI_COMM_WORLD);
		}
		if(contador[id] == numeroDeVizinhos)
			if(pai[id]!=0)
				MPI_Send(&id, 1, MPI_INT, pai[id], tag, MPI_COMM_WORLD);
	}
	printf("Processo %d: Elementos conectados: ", myRank);
	for(i=0; i<numeroDeTarefas; i++)
		if(contador[i] != 0) printf("%d", i);
	printf("\n");
	fflush(stdout);
	MPI_Finalize();
}
Ejemplo n.º 2
0
int main(int argc, char*argv[]) {
    int i, j, contador;
    int numeroDeVizinhos;
    int myRank;
    int source;
    int tag = 50;
    int pai;
    MPI_Status status;
    int origem;
    int state; //marca o pulso atual deste processo
    int dist[numeroDeTarefas]; //distância
    int first[numeroDeTarefas]; //primeiro nó no caminho int set[numeroDeTarefas];
    int set[numeroDeTarefas];
    int level[numeroDeTarefas]; //pulso dos meus vizinhos

	MPI_Init(&argc, &argv);
	MPI_Comm_rank(MPI_COMM_WORLD, &myRank);

    numeroDeVizinhos = contaNumeroDeVizinhos(myRank);

	printf("iniciando...\n");
	fflush(stdout);

	for(i = 0; i < numeroDeTarefas; i++) {
		dist[i] = numeroDeTarefas;
		first[i] = -1;
		set[i] = 0;
		level[i] = 0;
	}

	dist[myRank] = 0;
	set[myRank] = 1;
	state = 0;

	for(i = 0; i < numeroDeTarefas; i++) {
        if(matrizVizinha[myRank][i] == 1) {
            MPI_Send(set, numeroDeTarefas, MPI_INT, i, tag, MPI_COMM_WORLD);
        }
    }

	while (state < numeroDeTarefas - 1) {
        MPI_Recv(set, numeroDeTarefas, MPI_INT, MPI_ANY_SOURCE, tag, MPI_COMM_WORLD, &status);
        origem = status.MPI_SOURCE;
        level[origem]++;
        for (i = 0; i < numeroDeTarefas; i++) {
            if(set[i] == 1) {
                if (dist[i] > level[origem]) {
                    dist[i] = level[origem];
                    first[i] = origem;
                }
                int continua = 1;
                for(j = 0; j < numeroDeTarefas; j++) {
                    if(matrizVizinha[myRank][j] == 1 && state >= level[j]) {
                        continua = 0;
                        break;
                    }
                }
                if(continua) {
                    state++;
                    for(j = 0; j < numeroDeTarefas; j++) {
                        if(dist[j] == state) {
                            set[j] = 1;
                        }
                    }
                    for(j = 0; j < numeroDeTarefas; j++) {
                        if(matrizVizinha[myRank][j] == 1) {
                            MPI_Send(set, numeroDeTarefas, MPI_INT, j, tag, MPI_COMM_WORLD);
                        }
                    }
                }
            }
        }
        // printf("[P%d]: State %d\n", myRank, state);
        fflush(stdout);
    }

    //imprimindo as distâncias
    printf("processo %d: ", myRank);
    for (i = 0; i < numeroDeTarefas; i++) {
        printf("dist(%d)=%d, ", i, dist[i]);
    }
    printf("\n");
    printf("processo %d: ", myRank);
    for (i = 0; i < numeroDeTarefas; i++) {
        printf("first(%d)=%d, ", i, first[i]);
    }
    printf("\n");
    fflush(stdout);
    //Finalização do MPI
    MPI_Finalize();
}