Acwing--850. Dijkstra求最短路 II(模板)

给定一个 n 个点 m条边的有向图,图中可能存在重边和自环,所有边权均为非负值。

请你求出 1 号点到 n 号点的最短距离,如果无法从 1 号点走到 n 号点,则输出 −1。

输入格式

第一行包含整数 n 和 m。

接下来 m 行每行包含三个整数 x,y,z,表示存在一条从点 x 到点 y 的有向边,边长为 z。

输出格式

输出一个整数,表示 1 号点到 n 号点的最短距离。

如果路径不存在,则输出 −1。

数据范围

1≤n,m≤1.5×105
图中涉及边长均不小于 0,且不超过 10000。

输入样例:

3 3
1 2 2
2 3 1
1 3 4

输出样例:

3

堆优化版本的dijkstra算法,时间复杂度m*logn。

具体是使用优先队列的小根堆来优化,使每次在未确定最短距离的点中查找距离最近的点的时间复杂度降低。因为使用优先队列会存在冗余,所以需要写个book数组来记录哪些点已经是确定了最短距离的。for循环该点所连接的所有的边,尝试更新其他点

注意:初始化d数组为0x3f3f3f3f   (4个3f )

#include<bits/stdc++.h>
using namespace std;
const int N=150010;
int e[N]
由于没有Ac - Wing 4872题“短路之和”的具体题目描述,下面提供通用的解决短路问题的思路及示例代码,通常这类问题可以使用Dijkstra算法、Floyd算法等。 ### Dijkstra算法思路 Dijkstra算法用于解单源短路径问题,即从一个固定的起点到图中其他所有顶点的短路径。其基本思想是维护一个距离数组`dist`,记录从起点到各个顶点的短距离,初始时除起点外其他顶点的距离设为无穷大。每次从`dist`数组中选择距离小且未被确定短路径的顶点,然后以该顶点为中间点,更新其邻接顶点的距离。 ### Dijkstra算法Python代码示例 ```python import heapq from collections import defaultdict def dijkstra(graph, start): dist = {node: float('inf') for node in graph} dist[start] = 0 pq = [(0, start)] while pq: current_dist, current_node = heapq.heappop(pq) if current_dist > dist[current_node]: continue for neighbor, weight in graph[current_node].items(): distance = current_dist + weight if distance < dist[neighbor]: dist[neighbor] = distance heapq.heappush(pq, (distance, neighbor)) return dist # 示例图 graph = { 'A': {'B': 1, 'C': 4}, 'B': {'A': 1, 'C': 2, 'D': 5}, 'C': {'A': 4, 'B': 2, 'D': 1}, 'D': {'B': 5, 'C': 1} } start_node = 'A' shortest_distances = dijkstra(graph, start_node) print(shortest_distances) ``` ### Floyd算法思路 Floyd算法用于解图中任意两点之间的短路径。其基本思想是通过动态规划的方法,逐步更新任意两点之间的短距离。对于每一个中间点`k`,检查是否可以通过该中间点缩短任意两点`i`和`j`之间的距离。 ### Floyd算法Python代码示例 ```python INF = float('inf') def floyd(graph): n = len(graph) dist = [[graph[i][j] if graph[i][j] != 0 else INF for j in range(n)] for i in range(n)] for k in range(n): for i in range(n): for j in range(n): if dist[i][k] != INF and dist[k][j] != INF and dist[i][j] > dist[i][k] + dist[k][j]: dist[i][j] = dist[i][k] + dist[k][j] return dist # 示例图的邻接矩阵 graph = [ [0, 1, 4, INF], [1, 0, 2, 5], [4, 2, 0, 1], [INF, 5, 1, 0] ] shortest_distances = floyd(graph) for row in shortest_distances: print(row) ``` 如果要计算短路之和,在得到所有短路径后,将需要的短路径距离相加即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值