Dijkstra算法(堆优化版)精讲
题目描述
小明需要从第一个车站出发,到达最后一个车站参加科学大会。途中各车站之间的道路状况、交通拥堵程度等因素会影响通行时间。小明希望选择一条时间最短的路线。
输入包含车站数量N和公路数量M,接下来M行每行三个整数S、E、V,表示从S车站到E车站的单向道路,花费V单位时间。输出从起点到终点的最短时间,若无法到达则输出-1。
输入输出示例
输入:
7 9
1 2 1
1 3 4
2 3 2
2 4 5
3 4 2
4 5 3
2 6 4
5 7 4
6 7 9
输出:
12
解题思路
算法原理
Dijkstra算法用于求解单源最短路径问题,适用于有权重的有向或无向图,且所有边的权重非负。堆优化版Dijkstra算法通过优先队列(小顶堆)来优化节点选择过程,降低时间复杂度。
图的存储
使用邻接表存储图结构,邻接表由数组和链表组成,每个节点对应一个链表,链表中存储该节点直接指向的其他节点及边的权重。
堆优化细节
- 优先队列:用优先队列(小顶堆)存储待处理的节点,按源点到该节点的当前最短距离排序,每次取出距离最小的节点进行处理。
- 节点选择:通过堆顶元素直接获取距离源点最近的未访问节点,避免遍历所有节点查找最小距离。
- 距离更新:处理当前节点时,遍历其邻接节点,若通过当前节点到达邻接节点的距离更短,则更新距离并将其加入优先队列。
代码实现
import java.util.*;
class Edge {
int to; // 邻接顶点
int val; // 边的权重
Edge(int to, int val) {
this.to = to;
this.val = val;
}
}
class MyComparison implements Comparator<Pair<Integer, Integer>> {
@Override
public int compare(Pair<Integer, Integer> lhs, Pair<Integer, Integer> rhs) {
return Integer.compare(lhs.second, rhs.second);
}
}
class Pair<U, V> {
public final U first;
public final V second;
public Pair(U first, V second) {
this.first = first;
this.second = second;
}
}
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt(

最低0.47元/天 解锁文章
977

被折叠的 条评论
为什么被折叠?



