Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Dijkstra(int n, int source, int *graph, int *lengths, MPI_Comm comm)
- {
- int i, j;
- int nlocal; /* Liczba lokalnych wierzcholkow (dla danego procesora)*/
- int *marker; /* Pomocnicza tablica, sluzy do oznaczania wierzcholkow nalezacych do vt */
- int firstvtx; /* Index pierwszego wierzcholka przechowywanego lokalnie przez dany procesor */
- int lastvtx; /* Index ostatniego wierzcholka przechowywanego lokalnie przez danych procesor */
- int u, udist;
- int localMin[2], globalMin[2];
- int size, myrank;
- MPI_Status status;
- MPI_Comm_size(comm, &size);
- MPI_Comm_rank(comm, &myrank);
- nlocal = n/size;
- firstvtx = myrank*nlocal;
- lastvtx = firstvtx+nlocal-1;
- /* ustawianie inicjalizacyjnych dystansów ze źródła do reszty wierzchołków */
- for (j=0; j<nlocal; j++){
- lengths[j] =graph[source*nlocal + j];
- //printf("myrnak: %d\tlengths[j] = %d\n",myrank,lengths[j]);
- }
- /* W tablicy marker będa zapisywane informacje, czy najkrotsza scieżka została znaleziona czy jeszcze nie */
- /* Jeżeli wartość w tej tablicy jest równa 1 to ścieżka jest znaleziona, w przeciwnym wypadku nie jest znaleziona */
- marker = (int *)malloc(nlocal*sizeof(int));
- for (j=0; j<nlocal; j++)
- marker[j] = 1;
- /* Proces, ktory przechowuje wierzcholek zrodlowy oznacza go jako widoczny */
- if (source >= firstvtx && source <= lastvtx)
- marker[source-firstvtx] = 0;
- for (i=1; i<n; i++) {
- /* Znalzioenie lokalnego wierzchołka, ktory ma najmniejszy dystans od zrodla */
- localMin[0] = INT_MAX;
- localMin[1] = -1;
- for (j=0; j<nlocal; j++) {
- if (marker[j] && lengths[j] < localMin[0]) {
- localMin[0] = lengths[j];//dystans
- localMin[1] = firstvtx+j; //wierzcholek
- }
- }
- /* Znalezienie wierzcholka ktory jest globalnym minimum i wstawienie go do zmiennych udist i u */
- MPI_Allreduce(localMin, globalMin, 1, MPI_2INT, MPI_MINLOC, comm);
- udist = globalMin[0];
- u = globalMin[1];
- /* proces, tkory przechowuje wierzcholek minimum oznacza go jako widoczny */
- if (u == localMin[1])
- marker[u-firstvtx] = 0;
- /* Aktualizacja dystansów */
- for (j=0; j<nlocal; j++) {
- if (marker[j] && udist + graph[u*nlocal+j] < lengths[j])
- lengths[j] = udist + graph[u*nlocal+j];
- }
- }
- free(marker);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement