Dijkstra算法(邻接表空间复杂度优化) 单源最短路经

本文介绍了如何使用Dijkstra算法并优化邻接表空间复杂度,以解决单源最短路径问题。通过示例展示了算法的具体实现过程,包括初始化距离数组、更新最短路径和遍历邻接表等步骤。最后,提供了输入输出示例来验证算法的正确性。

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

小明居住在h城,这一个地区算上h城共有n个城市,n个城市之间共有m条单行道,小明想要知道n个城市中每一个城市到达h城的道路距离,并且将这些距离按照从小到大顺序排列好输出
现在请你帮帮小明


#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int  main()
{
    int n,m,h;   //n代表城市数量,m代表道路数(全部为单向路),h代表小明出发城市代号
    int u[5000]={0},v[5000]={0},w[5000]={0};//用来储存此道路出发城市u[i]---目的城市v[i]的距离w[i]
    int first[5000]={0},next[5000]={0};     //在邻接表中使用first[i]数组储存城市i最后一条公路(也可以说是第一条,反正最后会遍历)
    int dis[5000]={0};                      //用来储存每个城市距离城市h的最小距离;初始化全部为inf;本身为0
    int book[5000]={0};
    int inf=99999999;
    memset(first,-1,sizeof(first));
    memset(next,-1,sizeof(next));
    memset(book,0,sizeof(book));
    cin>>n>>m>>h;
    for(int i=0;i<=n;i++){
        dis[i]=inf;
    }
    dis[h]=0;
    book[h]=1;
    for(int i=1;i<=m;i++){
        cin>>u[i]>>v[i]>>w[i];
        next[i]=first[u[i]];/*这两句是邻接表优化的核心*/
        first[u[i]]=i
好的,以下是使用邻接表方式实现Dijkstra单源路径算法的Python代码: ```python import heapq # 无穷大表示两个节点不连通 INF = float("inf") def dijkstra(graph, start): """ 使用Dijkstra算法计算图中start节点到其他节点的路径 :param graph: 邻接表表示的图 :param start: 起始节点 :return: 起始节点到各个节点的路径长度 """ # 初始化距离为无穷大 dist = {node: INF for node in graph} # 起始节点到自身的距离为0 dist[start] = 0 # 使用堆优化,使得每次取出距离小的节点 heap = [(0, start)] while heap: # 取出距离小的节点和距离 (d, node) = heapq.heappop(heap) # 如果当前节点已经处理过,跳过 if d > dist[node]: continue # 遍历当前节点的邻居节点 for neighbor, weight in graph[node].items(): # 计算从起始节点到邻居节点的距离 distance = dist[node] + weight # 如果新的距离比原来的距离小,更新距离 if distance < dist[neighbor]: dist[neighbor] = distance # 将邻居节点加入堆中 heapq.heappush(heap, (distance, neighbor)) return dist ``` 使用示例: ```python graph = { "A": {"B": 5, "C": 1}, "B": {"A": 5, "C": 2, "D": 1}, "C": {"A": 1, "B": 2, "D": 4, "E": 8}, "D": {"B": 1, "C": 4, "E": 3, "F": 6}, "E": {"C": 8, "D": 3}, "F": {"D": 6} } print(dijkstra(graph, "A")) ``` 输出结果: ``` {'A': 0, 'B': 3, 'C': 1, 'D': 4, 'E': 7, 'F': 10} ``` 其中,字典中的键表示节点,值表示起始节点到该节点的路径长度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值