91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

C++ Dijkstra算法如何并行化

c++
小樊
87
2024-07-25 17:27:18
欄目: 編程語言

在C++中,Dijkstra算法可以通過使用并行化技術來加速處理過程。一種常見的方法是使用OpenMP庫來實現并行化。以下是一個簡單的示例代碼,展示了如何在C++中使用OpenMP并行化Dijkstra算法:

#include <iostream>
#include <vector>
#include <limits>
#include <omp.h>

#define INF std::numeric_limits<int>::max()

int dijkstra(const std::vector<std::vector<int>>& graph, int source, int destination) {
    int num_vertices = graph.size();
    std::vector<int> distance(num_vertices, INF);
    std::vector<bool> visited(num_vertices, false);

    distance[source] = 0;
    
#pragma omp parallel for
    for (int i = 0; i < num_vertices; i++) {
        int u = -1;
        int min_distance = INF;
        
        // Find the vertex with the minimum distance from the source
        for (int j = 0; j < num_vertices; j++) {
            if (!visited[j] && distance[j] < min_distance) {
                u = j;
                min_distance = distance[j];
            }
        }
        
        if (u == -1) break; // No more vertices to visit
        
        visited[u] = true;
        
        // Update the distances of neighboring vertices
#pragma omp parallel for
        for (int v = 0; v < num_vertices; v++) {
            if (!visited[v] && graph[u][v] && distance[u] != INF && distance[u] + graph[u][v] < distance[v]) {
                distance[v] = distance[u] + graph[u][v];
            }
        }
    }

    return distance[destination];
}

int main() {
    std::vector<std::vector<int>> graph = {
        {0, 4, 0, 0, 0, 0, 0, 8, 0},
        {4, 0, 8, 0, 0, 0, 0, 11, 0},
        {0, 8, 0, 7, 0, 4, 0, 0, 2},
        {0, 0, 7, 0, 9, 14, 0, 0, 0},
        {0, 0, 0, 9, 0, 10, 0, 0, 0},
        {0, 0, 4, 14, 10, 0, 2, 0, 0},
        {0, 0, 0, 0, 0, 2, 0, 1, 6},
        {8, 11, 0, 0, 0, 0, 1, 0, 7},
        {0, 0, 2, 0, 0, 0, 6, 7, 0}
    };

    int source = 0;
    int destination = 4;
    int shortest_path = dijkstra(graph, source, destination);

    std::cout << "Shortest path from vertex " << source << " to vertex " << destination << " is " << shortest_path << std::endl;

    return 0;
}

在上面的示例中,我們使用了OpenMP的并行for循環指令#pragma omp parallel for來并行執行算法的主要部分。這樣可以加速Dijkstra算法的運行,特別是當處理大量頂點和邊時。請注意,要使用OpenMP庫,您需要在編譯時添加 -fopenmp 標志。

0
宁晋县| 青铜峡市| 察隅县| 临武县| 黄龙县| 湖州市| 兰西县| 嘉荫县| 太白县| 长垣县| 黑山县| 太保市| 忻城县| 平顺县| 凤凰县| 日喀则市| 苏尼特右旗| 尤溪县| 皮山县| 青冈县| 贵阳市| 刚察县| 航空| 德州市| 华蓥市| 思茅市| 云安县| 永顺县| 嫩江县| 临夏市| 宾阳县| 泰州市| 昌图县| 阿克苏市| 荔波县| 宜阳县| 扎兰屯市| 高平市| 安宁市| 乌拉特前旗| 城步|