OpenMP в алгоритме Дейкстры

Имеется полностью рабочий алгоритм Дейкстры, что берет значения из файла (или записывает новый) и забивает данными матрицу. Каким образом можно улучшить программу при помощи OpenMP, чтобы скорость ее работы существенно возросла?

Ниже прикрепляю весь код:

#include <iostream>
#include <fstream>
#include <string>
#include <climits>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <iomanip>
#include <locale.h>
#include <chrono>

using namespace std;

class Timer
{
private:
    using clock_t = std::chrono::high_resolution_clock;
    using second_t = std::chrono::duration<double, std::ratio<1> >;

    chrono::time_point<clock_t> m_beg;

public:
    Timer() : m_beg(clock_t::now())
    {
    }

    double elapsed() const
    {
        return std::chrono::duration_cast<second_t>(clock_t::now() - m_beg).count();
    }
};

void fillingArray(int** arr, int c, string filename) {
    ofstream fout(filename);
    srand(static_cast<unsigned int>(time(0)));
    for (int i = 0; i < c; i++){
        for (int j = 0; j < c; j++) {
            arr[i][j] = arr[j][i] = rand() % 10 + 1;
        }
    }
    for (int i = 0; i < c; i++) {
        fout << endl;
        for (int j = 0; j < c; j++) {
            fout << setw(5) << arr[i][j];
        }
    }
}

void read(int** arr, int c, string filename) {
    char answer;
    ifstream file;
    file.open(filename);
    if (!file) {
        fillingArray(arr, c, filename);
    }
    else {
        cout << "Файл найден\nХотите его перезаписать? (y / n)\n";
        cin >> answer;
        if (answer == 'y' || answer == 'Y') {
            fillingArray(arr, c, filename);
        }
        else {
            for (int i = 0; i < c; i++) {
                for (int j = 0; j < c; j++) {
                    file >> arr[i][j];
                }
            }
        }
    }
    file.close();
}

void Dijkstra(int** arr, int c, int st)
{
    Timer t;

    int count, index, i, u, m = st + 1;
    int* distance = (int*)malloc(c * sizeof(int*));
    bool* visited = new bool[c];
    for (i = 0; i < c; i++)
    {
        distance[i] = INT_MAX; visited[i] = false;
    }
    distance[st] = 0;
    for (count = 0; count < c - 1; count++)
    {
        int min = INT_MAX;
        for (i = 0; i < c; i++)
            if (!visited[i] && distance[i] <= min)
            {
                min = distance[i]; index = i;
            }
        u = index;
        visited[u] = true;
        for (i = 0; i < c; i++)
            if (!visited[i] && arr[u][i] && distance[u] != INT_MAX &&
                distance[u] + arr[u][i] < distance[i])
                distance[i] = distance[u] + arr[u][i];
    }
    cout << "Стоимость пути из начальной вершины до остальных:\t\n";
    for (i = 0; i < c; i++) if (distance[i] != INT_MAX)
        cout << m << " > " << i + 1 << " = " << distance[i] << endl;
    else cout << m << " > " << i + 1 << " = " << "маршрут недоступен" << endl;

    cout << "Прошло времени: " << t.elapsed() << "с\n";
    delete[] visited;
    delete[] distance;
}

int main()
{
    setlocale(LC_ALL, "Russian");
    string filename, rash;
    filename = "arr";
    rash = ".dat";

    int c;
    cout << "Введите количество ребер:\n";
    cin >> c;

    int** arr = (int**)malloc(c * sizeof(int*));
    for (int i = 0; i < c; i++) {
        arr[i] = (int*)malloc(c * sizeof(int));
    }

    filename += to_string(c) + rash;

    read(arr, c, filename);

    Dijkstra(arr, c, 0);

    delete[] arr;
}

Ответы (0 шт):