迪杰斯特拉算法 代码

本文详细介绍了Dijkstra算法的原理及其在带权图中的应用,提供了Python和C++的实现代码示例,展示了如何使用邻接矩阵来寻找从给定起点到其他节点的最短路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考链接:

【路径规划】全局路径规划算法——Dijkstra算法(含python实现 | c++实现)-优快云博客 

 算法图解:

代码

def dijkstra(matrix, source):
    """迪杰斯特拉算法实现
    Args:
        matrix (_type_): 用邻接矩阵表示带权图
        source (_type_): 起点

    Returns:
        _type_: 最短路径的节点集合,最短路径的节点的最短距离,每个节点到起点的最短路径
    """
    INF = float('inf')
    n = len(matrix)
    m = len(matrix[0])
    assert n == m, "Error, please examine matrix dim"
    assert source < n, "Error, start point should be in the range!"
    S = [source]        # 已找到最短路径的节点集合   S:可以缩写为"SP",代表"Shortest Path"(最短路径)。
    U = [v for v in range(n) if v not in S]  # 记录还未确定最短路径的节点集合  U:可以缩写为"UNP",代表"Unprocessed Nodes"(未处理的节点)。
    distance = [INF] * n          # source到已找到最短路径的节点的最短距离
    distance[source] = 0  # 起点到自己的距离
    path_optimal = [[]]*n           # source到其他节点的最短路径
    path_optimal[source] = [source]
    while len(S) < n:   # 当已找到最短路径的节点小于n时
        min_value = INF
        col = -1
        row = -1
        for s in S:     # 以已找到最短路径的节点所在行为搜索对象
            for u in U:   # 从U中搜索尚未记录的节点
                if matrix[s][u] + distance[s] < min_value:  # 找出最小值
                    # 在某行找到最小值要加上source到该行的最短路径
                    min_value = matrix[s][u] + distance[s]
                    row = s         # 记录所在行列
                    col = u
        if col == -1 or row == -1:  # 若没找出最小值且节点还未找完,说明图中存在不连通的节点
            break
        S.append(col)  # 在S中添加已找到的节点
        U.remove(col)  # 从U中移除已找到的节点
        distance[col] = min_value # source到该节点的最短距离即为min_value
        path_optimal[col] = path_optimal[row][:]    # 复制source到已找到节点的上一节点的路径
        path_optimal[col].append(col)       # 再其后添加已找到节点即为source到该节点的最短路径
    return S, distance, path_optimal


def main():
    INF = float('inf')
    # 使用邻接矩阵存储图
    # A B C D E F G
    matrix = [[0, 12, INF, INF, INF, 16, 14],
            [12, 0, 10, INF, INF, 7, INF],
            [INF, 10, 0, 3, 5, 6, INF],
            [INF, INF, 3, 0, 4, INF, INF],
            [INF, INF, 5, 4, 0, 2, 8],
            [16, 7, 6, INF, 2, 0, 9],
            [14, INF, INF, INF, 8, 9, 0]]
    S, distance, path_optimal = dijkstra(matrix, 3)
    print('S:')
    print(S)
    print('distance:')
    print(distance)
    print('path_optimal:')
    for p in path_optimal:
        print(p)

if __name__ == '__main__':
    main()


### 使用Code::Blocks编写迪杰斯特拉算法 迪杰斯特拉算法用于计算加权图中的最短路径。下面是在Code::Blocks环境中使用C++实现该算法的一个例子: ```cpp #include <iostream> #include <vector> #include <queue> #include <climits> using namespace std; struct Node { int vertex; int weight; }; typedef pair<int, int> ipair; void dijkstra(vector<vector<Node>>& graph, int src) { int V = graph.size(); vector<int> dist(V, INT_MAX); priority_queue<ipair, vector<ipair>, greater<ipair>> pq; pq.push(make_pair(0, src)); dist[src] = 0; while (!pq.empty()) { int u = pq.top().second; pq.pop(); for (auto& neighbor : graph[u]) { int v = neighbor.vertex; int weight = neighbor.weight; if (dist[v] > dist[u] + weight) { dist[v] = dist[u] + weight; pq.push(make_pair(dist[v], v)); } } } cout << "Vertex Distance from Source\n"; for (int i = 0; i < V; ++i) cout << i << "\t\t" << dist[i] << endl; } int main() { int V = 9; vector<vector<Node>> graph(V); // Adding edges to the graph void addEdge(int u, int v, int w, vector<vector<Node>>& adj){ adj[u].push_back({v,w}); adj[v].push_back({u,w}); }; addEdge(0, 1, 4, graph); addEdge(0, 7, 8, graph); addEdge(1, 2, 8, graph); addEdge(1, 7, 11, graph); addEdge(2, 3, 7, graph); addEdge(2, 5, 4, graph); addEdge(2, 8, 2, graph); addEdge(3, 4, 9, graph); addEdge(3, 5, 14, graph); addEdge(4, 5, 10, graph); addEdge(5, 6, 2, graph); addEdge(6, 7, 1, graph); addEdge(6, 8, 6, graph); addEdge(7, 8, 7, graph); dijkstra(graph, 0); return 0; } ``` 此代码实现了基于优先队列优化版本的迪杰斯特拉算法,能够有效地找到从源节点到其他所有顶点之间的最短距离[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值