Advertisement
Guest User

Untitled

a guest
May 20th, 2019
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.89 KB | None | 0 0
  1. #include <iostream>
  2. #include <omp.h>
  3. #include <vector>
  4. #include <fstream>
  5. #include <time.h>
  6. #include <algorithm>
  7.  
  8. using namespace std;
  9.  
  10. const int numberOfThreads = 8;
  11.  
  12. vector < vector <int> > readArrayFromFile(string filename) {
  13.     int m;
  14.  
  15.     ifstream fin(filename);
  16.     fin >> m;
  17.  
  18.     vector < vector <int> > matrix(m);
  19.  
  20.     for (int i = 0; i < m; i++) {
  21.         matrix[i].resize(m);
  22.         for (int j = 0; j < m; j++) {
  23.             fin >> matrix[i][j];
  24.         }
  25.     }
  26.     return matrix;
  27. }
  28.  
  29. void createMatrixFile(string filename, int m) {
  30.     ofstream fout;
  31.     fout.open(filename);
  32.     fout << m << endl;
  33.  
  34.     for (int i = 0; i < m; i++) {
  35.         for (int j = 0; j < m; j++) {
  36.             if (i != j) {
  37.                 fout << rand() % 9 + 1 << " ";
  38.             }
  39.             else {
  40.                 fout << 0 << " ";
  41.             }
  42.         }
  43.         fout << endl;
  44.     }
  45. }
  46.  
  47. void writeMatrixInFile(string filename, vector <int>&matrix) {
  48.     ofstream fout;
  49.     fout.open(filename);
  50.     fout << matrix.size() << endl;
  51.  
  52.     for (int i = 0; i < matrix.size(); i++) {
  53.         fout << matrix[i] << endl;
  54.     }
  55. }
  56.  
  57. vector <int> dijkstra_seq(vector < vector <int> >&graph, int start) {
  58.     vector <int> dist(graph.size());
  59.     bool *used = new bool[graph.size()];
  60.  
  61.     for (int i = 0; i < graph.size(); ++i) {
  62.         dist[i] = INT_MAX;
  63.         used[i] = false;
  64.     }
  65.     dist[start] = 0;
  66.  
  67.     for (int j = 0; j < graph.size(); ++j) {
  68.         int v = -1;
  69.         int currentDist = INT_MAX;
  70.  
  71.         #pragma omp parallel
  72.         {
  73.             int localV = -1;
  74.             int localDist = INT_MAX;
  75.  
  76.             #pragma omp for nowait
  77.             for (int i = 0; i < graph.size(); ++i) {
  78.                 if (!used[i] && localDist > dist[i]) {
  79.                     localV = i;
  80.                     localDist = dist[i];
  81.                 }
  82.             }
  83.  
  84.             #pragma omp critical
  85.             {
  86.                 if (localDist < currentDist) {
  87.                     currentDist = localDist;
  88.                     v = localV;
  89.                 }
  90.             }
  91.         }
  92.  
  93.         used[v] = true;
  94.  
  95.         #pragma omp parallel for
  96.         for (int i = 0; i < graph.size(); ++i) {
  97.             if (!used[i] && graph[v][i] < INT_MAX && graph[v][i] >= 0) {
  98.                 dist[i] = min(dist[i], dist[v] + graph[v][i]);
  99.             }
  100.         }
  101.     }
  102.  
  103.     delete[](used);
  104.     return dist;
  105. }
  106.  
  107. int main(int argc, char **argv)
  108. {
  109.     createMatrixFile("matrix.txt", 3000);
  110.     vector < vector <int> > matrix = readArrayFromFile("matrix.txt");
  111.  
  112.     vector <int> result(matrix.size());
  113.  
  114.     omp_set_num_threads(numberOfThreads);
  115.  
  116.     time_t start = time(NULL);
  117.  
  118.     result = dijkstra_seq(matrix, 1);
  119.  
  120.     cout << "Execution time: " << time(NULL) - start << " sec." << endl;
  121.  
  122.     writeMatrixInFile("result.txt", result);
  123.  
  124.     return 0;
  125. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement