fork download
  1. #include <iostream>
  2. #include <vector>
  3. #include <limits>
  4. #include <chrono>
  5. #include <mpi.h>
  6.  
  7. using namespace std;
  8.  
  9. // Структура для представления взвешенного ребра в графе
  10. struct Edge {
  11. int to;
  12. int weight;
  13. Edge(int t, int w) : to(t), weight(w) {}
  14. };
  15.  
  16. // Функция для нахождения кратчайших путей от источника ко всем остальным вершинам
  17. void dijkstra(const vector<vector<Edge>>& graph, int source, vector<int>& dist, int rank, int size) {
  18. int V = graph.size();
  19. dist.assign(V, numeric_limits<int>::max());
  20. dist[source] = 0;
  21.  
  22. // Очередь приоритетов для хранения вершин и их расстояний
  23. priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
  24. pq.push({0, source});
  25.  
  26. while (!pq.empty()) {
  27. int u = pq.top().second;
  28. int d = pq.top().first;
  29. pq.pop();
  30.  
  31. if (d > dist[u]) continue;
  32.  
  33. // Параллельное распределение работы
  34. for (int v = rank; v < V; v += size) {
  35. for (const Edge& e : graph[v]) {
  36. if (dist[v] + e.weight < dist[e.to]) {
  37. dist[e.to] = dist[v] + e.weight;
  38. // Отправка обновленного расстояния всем процессам
  39. MPI_Allreduce(MPI_IN_PLACE, &dist[e.to], 1, MPI_INT, MPI_MIN, MPI_COMM_WORLD);
  40. }
  41. }
  42. }
  43. }
  44. }
  45.  
  46. int main(int argc, char** argv) {
  47. MPI_Init(&argc, &argv);
  48.  
  49. int rank, size;
  50. MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  51. MPI_Comm_size(MPI_COMM_WORLD, &size);
  52.  
  53. // Пример представления графа (список смежности)
  54. vector<vector<Edge>> graph = {
  55. {{1, 10}, {2, 5}}, // Вершина 0: (1, 10), (2, 5)
  56. {{3, 1}}, // Вершина 1: (3, 1)
  57. {{1, 3}, {3, 8}}, // Вершина 2: (1, 3), (3, 8)
  58. {{0, 2}} // Вершина 3: (0, 2)
  59. };
  60.  
  61. int source = 0;
  62. vector<int> dist(graph.size(), numeric_limits<int>::max());
  63.  
  64. auto start = chrono::high_resolution_clock::now();
  65. dijkstra(graph, source, dist, rank, size);
  66. auto end = chrono::high_resolution_clock::now();
  67.  
  68. // Вывод результатов только из процесса с рангом 0
  69. if (rank == 0) {
  70. chrono::duration<double> elapsed_seconds = end - start;
  71. cout << "Dijkstra's algorithm took " << elapsed_seconds.count() << " seconds" << endl;
  72. for (int i = 0; i < dist.size(); ++i) {
  73. cout << "Distance from source to vertex " << i << ": " << dist[i] << endl;
  74. }
  75. }
  76.  
  77. MPI_Finalize();
  78.  
  79. return 0;
  80. }
  81.  
Success #stdin #stdout #stderr 0.25s 40732KB
stdin
public class q1{
  }
stdout
Standard output is empty
stderr
Error: unexpected symbol in "using namespace"
Execution halted