Advertisement
Guest User

Untitled

a guest
May 21st, 2018
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.25 KB | None | 0 0
  1. Dijkstra(int n, int source, int *graph, int *lengths, MPI_Comm comm)
  2.  {
  3.     int i, j;
  4.     int nlocal; /* Liczba lokalnych wierzcholkow (dla danego procesora)*/
  5.     int *marker; /* Pomocnicza tablica, sluzy do oznaczania wierzcholkow nalezacych do vt */
  6.     int firstvtx; /* Index pierwszego wierzcholka przechowywanego lokalnie przez dany procesor */
  7.     int lastvtx; /* Index ostatniego wierzcholka przechowywanego lokalnie przez danych procesor */
  8.     int u, udist;
  9.     int localMin[2], globalMin[2];
  10.     int size, myrank;
  11.     MPI_Status status;
  12.     MPI_Comm_size(comm, &size);
  13.     MPI_Comm_rank(comm, &myrank);
  14.     nlocal = n/size;
  15.     firstvtx = myrank*nlocal;
  16.     lastvtx = firstvtx+nlocal-1;
  17.  
  18.  /* ustawianie inicjalizacyjnych dystansów ze źródła do reszty wierzchołków */
  19.     for (j=0; j<nlocal; j++){
  20.         lengths[j] =graph[source*nlocal + j];
  21.         //printf("myrnak: %d\tlengths[j] = %d\n",myrank,lengths[j]);
  22.     }
  23.  
  24.  /* W tablicy marker będa zapisywane informacje, czy najkrotsza scieżka została znaleziona czy jeszcze nie */
  25.  /* Jeżeli wartość w tej tablicy jest równa 1 to ścieżka jest znaleziona, w przeciwnym wypadku nie jest znaleziona */
  26.     marker = (int *)malloc(nlocal*sizeof(int));
  27.     for (j=0; j<nlocal; j++)
  28.         marker[j] = 1;
  29.  
  30.  /* Proces, ktory przechowuje wierzcholek zrodlowy oznacza go jako widoczny */
  31.     if (source >= firstvtx && source <= lastvtx)
  32.         marker[source-firstvtx] = 0;
  33.  
  34.  
  35.     for (i=1; i<n; i++) {
  36.  /*  Znalzioenie lokalnego wierzchołka, ktory ma najmniejszy dystans od zrodla */
  37.     localMin[0] = INT_MAX;
  38.     localMin[1] = -1;
  39.     for (j=0; j<nlocal; j++) {
  40.         if (marker[j] && lengths[j] < localMin[0]) {
  41.             localMin[0] = lengths[j];//dystans
  42.             localMin[1] = firstvtx+j; //wierzcholek
  43.         }
  44.     }
  45.  
  46.  /*  Znalezienie wierzcholka ktory jest globalnym minimum i wstawienie go do zmiennych udist i u */
  47.     MPI_Allreduce(localMin, globalMin, 1, MPI_2INT, MPI_MINLOC, comm);
  48.     udist = globalMin[0];
  49.     u = globalMin[1];
  50.  
  51.  /* proces, tkory przechowuje wierzcholek minimum oznacza go jako widoczny */
  52.     if (u == localMin[1])
  53.         marker[u-firstvtx] = 0;
  54.  
  55.  /* Aktualizacja dystansów */
  56.     for (j=0; j<nlocal; j++) {
  57.         if (marker[j] && udist + graph[u*nlocal+j] < lengths[j])
  58.             lengths[j] = udist + graph[u*nlocal+j];
  59.         }
  60.     }
  61.  
  62.     free(marker);
  63. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement