返回

探索C++中的迪杰斯特拉和弗洛伊德算法

前端

迪杰斯特拉和弗洛伊德算法是计算机科学中至关重要的图论算法,用于解决各种最短路径问题。它们在构建路由协议、优化物流系统和分析社交网络等众多实际应用中发挥着至关重要的作用。

迪杰斯特拉算法

迪杰斯特拉算法用于在带权图中从单一源点找到到所有其他顶点的最短路径。它通过迭代地松弛每个顶点来构建一个最短路径树,每次迭代都更新顶点到源点的最小距离。

弗洛伊德算法

弗洛伊德算法是一种动态规划算法,用于在带权图中找到任意两顶点之间的最短路径。它通过在迭代中构建最短路径表,逐渐得到所有最短路径。

C++实现

迪杰斯特拉算法

#include <vector>
#include <queue>

using namespace std;

// 顶点结构
struct Vertex {
    int distance;
    int predecessor;
};

// 图结构
struct Graph {
    vector<vector<pair<int, int>>> adjacencyList;
};

// 迪杰斯特拉算法
vector<Vertex> Dijkstra(const Graph& graph, int source) {
    vector<Vertex> vertices(graph.adjacencyList.size());
    for (int i = 0; i < vertices.size(); i++) {
        vertices[i].distance = INT_MAX;
        vertices[i].predecessor = -1;
    }
    vertices[source].distance = 0;

    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
    pq.push({0, source});

    while (!pq.empty()) {
        int distance = pq.top().first;
        int vertex = pq.top().second;
        pq.pop();

        if (distance > vertices[vertex].distance) {
            continue;
        }

        for (pair<int, int> edge : graph.adjacencyList[vertex]) {
            int adjacentVertex = edge.first;
            int weight = edge.second;

            if (vertices[vertex].distance + weight < vertices[adjacentVertex].distance) {
                vertices[adjacentVertex].distance = vertices[vertex].distance + weight;
                vertices[adjacentVertex].predecessor = vertex;
                pq.push({vertices[adjacentVertex].distance, adjacentVertex});
            }
        }
    }

    return vertices;
}

弗洛伊德算法

#include <vector>

using namespace std;

// 图结构
struct Graph {
    vector<vector<int>> adjacencyMatrix;
};

// 弗洛伊德算法
vector<vector<int>> Floyd(const Graph& graph) {
    int n = graph.adjacencyMatrix.size();
    vector<vector<int>> distances = graph.adjacencyMatrix;

    for (int k = 0; k < n; k++) {
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (distances[i][k] != INT_MAX && distances[k][j] != INT_MAX && distances[i][k] + distances[k][j] < distances[i][j]) {
                    distances[i][j] = distances[i][k] + distances[k][j];
                }
            }
        }
    }

    return distances;
}

实际应用

  • 路由协议: 迪杰斯特拉算法用于在网络路由协议(例如 OSPF 和 RIP)中计算最佳路径。
  • 物流优化: 弗洛伊德算法可用于优化物流配送路线,以找到从配送中心到各个客户的最短路径。
  • 社交网络分析: 迪杰斯特拉算法可以用来在社交网络中查找两个用户之间的最短路径(例如,通过共同的朋友)。

通过理解迪杰斯特拉和弗洛伊德算法的原理和实现,我们可以利用它们解决复杂的现实世界问题,例如优化资源分配、提高系统效率和改善决策制定。