当前位置: 首页 > news >正文

19840 Dijkstra求最短路2

19840 Dijkstra求最短路2

相较于1,数据增强了,要用堆来优化,也就是优先队列。

⭐️难度:中等
🌟考点:Dijkstra、最短路问题
📖
在这里插入图片描述

📚

import java.util.*;

public class Main {

    static int N = 100005;
    static int n;
    final static int INF = 0x3f3f3f3f;  // 一个足够大的数,同时确保不会超int
    static int[] dis = new int[N]; // 记录 点1 到每个人的最短距离
    static boolean[] vis = new boolean[N]; // 记录 该点是否已经被访问
    static ArrayList<int[]>[] g = new ArrayList[N]; // 语法注意

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        n = sc.nextInt();
        int m = sc.nextInt();

        for (int i = 0; i < m; i++) {
            int a = sc.nextInt();
            int b = sc.nextInt();
            int c = sc.nextInt();
            addEdge(a,b,c);
        }
        dijkstra(1);
        System.out.println(dis[n] == INF ? -1 : dis[n]);
    }

    // 加边
    static void addEdge(int u, int v, int w) {
        if (g[u] == null) g[u] = new ArrayList<>();
        g[u].add(new int[]{v, w});  // 语法注意
    }

    // Dijkstra
    static void dijkstra(int s){
        Arrays.fill(dis,INF); // 一开始标记为 所有点都不可达
        dis[s] = 0;
        PriorityQueue<int[]> q = new PriorityQueue<>(Comparator.comparingInt(e->e[1]));  // 比较数组的第二个元素,也就是边的权值,注意语法
        q.add(new int[]{s,0}); // 注意语法
        while(!q.isEmpty()){
            int[] cur = q.poll(); // 优先队列已经把权值按升序排好,只管取队头
            int u = cur[0];
            if(vis[u] == true) continue; // 若该店访问过,跳过
            vis[u] = true; // 标记为已访问
            if(g[u] == null) continue; // 改 点u 没有可指向边,跳过
            for(int[] e : g[u]){
                int v = e[0];  // 取点
                int w = e[1];  // 取权值
                if(dis[v] > dis[u] + w){
                    dis[v] = dis[u] + w; // 刷新 点1 到 点v 的最近距离
                    q.add(new int[]{v,dis[v]}); // 与 点u 相连的点入队列
                }

            }
        }
    }
}

🍎笔记
在这里插入图片描述
在这里插入图片描述

http://www.dtcms.com/a/99967.html

相关文章:

  • 文件上传存储安全OSS 对象分站解析安全解码还原目录执行
  • React编程的核心概念:数据流与观察者模式
  • POSIX 和 System V IPC的区别
  • 微信小程序(下)
  • 02_MySQL安装及配置
  • 去中心化金融的基石——以太坊
  • OSPF协议(1)
  • 海洋大地测量基准与水下导航系列之七我国海洋水下定位装备发展现状(下)
  • 耘想WinNAS:重新定义Windows电脑的存储革命
  • 一文速通Python并行计算:05 Python多线程编程-线程的定时运行
  • 查看达梦数据库对象
  • 信号与系统(郑君里)第一章-绪论 1-24 课后习题解答
  • C++学习之Linux文件编译、调试及库制作
  • 【AI论文】LeX-Art:通过可扩展的高质量数据合成重新思考文本生成
  • 命令窗口tuna.tsinghua.edu.cn,清华镜像源坏了,如何换成阿里源
  • codeformer论文学习
  • 三、分类模块,通用组件顶部导航栏Navbar
  • AireOS WLC安装License报错
  • Pytorch中torch.nn的学习
  • ‌19.思科路由器:OSPF协议引入直连路由的实验研究
  • keil自学笔记3(按键)
  • sqli-labs靶场 less 11
  • Qt warning LNK4042: 对象被多次指定;已忽略多余的指定
  • 机器学习的一百个概念(3)上采样
  • 创作领域“<em >一</em><em>分</em><em>快</em><em>3</em><em>官</em><em>网
  • Java 8 时区与历法处理指南:跨越全球的时间管理
  • Day50 单词规律
  • 小智机器人相关函数解析,BackgroundTask::Schedule (***)将一个回调函数添加到后台任务队列中等待执行
  • 多人协同进行qt应用程序开发应该注意什么?
  • ai画图flux redux图像文本双重引导生成。