代码随想录第五十九天| dijkstra(堆优化版)精讲 Bellman_ford 算法精讲

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算法通过优先队列(小顶堆)来优化节点选择过程,降低时间复杂度。

图的存储

使用邻接表存储图结构,邻接表由数组和链表组成,每个节点对应一个链表,链表中存储该节点直接指向的其他节点及边的权重。

堆优化细节

  1. 优先队列:用优先队列(小顶堆)存储待处理的节点,按源点到该节点的当前最短距离排序,每次取出距离最小的节点进行处理。
  2. 节点选择:通过堆顶元素直接获取距离源点最近的未访问节点,避免遍历所有节点查找最小距离。
  3. 距离更新:处理当前节点时,遍历其邻接节点,若通过当前节点到达邻接节点的距离更短,则更新距离并将其加入优先队列。

代码实现

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(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值