AcWing 850. Dijkstra求最短路 II

server/2024/9/24 5:23:28/

Problem: AcWing 850. Dijkstra求最短路 II

文章目录

  • 思路
  • 解题方法
  • 复杂度
  • Code

思路

这是一个经典的 Dijkstra 算法问题,我们需要找到从点 1 到点 n 的最短路径。Dijkstra 算法是一种贪心算法,它总是选择当前未访问过的节点中距离最短的一个,然后更新其相邻节点的距离。

解题方法

我们使用优先队列(Java 中的 PriorityQueue)来实现 Dijkstra 算法。优先队列可以在 O(logn) 的时间复杂度内插入和删除元素,且总是保持队列头部元素是优先级最高(距离最短)的元素。首先,我们初始化所有节点的距离为无穷大(Integer.MAX_VALUE),然后将起点(节点 1)的距离设为 0,并将其加入优先队列。然后,我们开始主循环,每次从优先队列中取出一个距离最短的节点,然后遍历其所有相邻节点,如果通过当前节点到达相邻节点的距离小于相邻节点当前的距离,就更新相邻节点的距离,并将其加入优先队列。重复这个过程,直到优先队列为空。

复杂度

时间复杂度:

O ( m l o g m ) O(mlogm) O(mlogm),其中 m 是边的数量。这是因为每条边都会被插入优先队列一次。

空间复杂度:

O ( n + m ) O(n + m) O(n+m),其中 n 是节点的数量,m 是边的数量。这是因为我们需要存储每个节点的距离(需要 O ( n ) O(n) O(n) 的空间),以及图的邻接表表示(需要 O ( m ) O(m) O(m) 的空间)。

Code

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.PriorityQueue;public class Main {static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));static StreamTokenizer sr = new StreamTokenizer(in);static int MAXN = (int) (1e5 + 10);static int MAXM = (int) (1e5 + 10);static int[] distance = new int[MAXN];static boolean[] vis = new boolean[MAXN];static ArrayList<ArrayList<int[]>> graph = new ArrayList<>();static PriorityQueue<int[]> heap = new PriorityQueue<>((a, b) -> a[1] - b[1]);static int n, m;public static void main(String[] args) throws IOException {n = nextInt();m = nextInt();build();for (int i = 0, u, v, w; i < m; i++) {u = nextInt();v = nextInt();w = nextInt();graph.get(u).add(new int[] { v, w });}distance[1] = 0;heap.add(new int[] { 1, 0 });while (!heap.isEmpty()) {int u = heap.poll()[0];if (vis[u]) {continue;}vis[u] = true;for (int[] edge : graph.get(u)) {int v = edge[0];int w = edge[1];if (!vis[v] && distance[u] + w < distance[v]) {distance[v] = distance[u] + w;heap.add(new int[] { v, distance[v] });}}}out.println(distance[n] == Integer.MAX_VALUE ? -1 : distance[n]);out.flush();}private static void build() {// TODO Auto-generated method stubgraph.clear();for (int i = 0; i <= n; i++) {graph.add(new ArrayList<>());}heap.clear();Arrays.fill(vis, false);Arrays.fill(distance, Integer.MAX_VALUE);}static int nextInt() throws IOException {sr.nextToken();return (int) sr.nval;}}

http://www.ppmy.cn/server/32310.html

相关文章

计算机——磁盘

磁盘介绍 磁盘&#xff08;Disk&#xff09;是计算机存储设备的一种&#xff0c;用于持久存储和读取数据。它以圆盘状的物理结构为基础&#xff0c;通过磁性材料在盘片上制造磁道和磁点&#xff0c;利用磁头来读写数据。 磁盘分类 磁盘的常见类型包括硬盘驱动器&#xff08;…

vivado Aurora 8B/10B IP核(12)- Setp By Step搭建FPGA工程

Step1:任意创建一个新的空的工程&#xff08;创建工程的具体工程如果还不清楚的看我们教程第一季部分&#xff09;&#xff0c; 并且进入IP CORE列表 右击Customize ip Step2:配置 IP CORE-Core options Step3:配置 IP CORE-GT Selections Step4:配置 IP CORE-Shared Logic 为 …

极简shell制作

&#x1f30e;自定义简单shell制作 &#xff08;ps: 文末有完整代码&#xff09; 文章目录&#xff1a; 自定义简单shell制作 简单配置Linux文件 自定义Shell编写 命令行解释器       获取输入的命令       字符串分割       子进程进行进程替换 内建命令…

Linux---软硬链接

软链接 我们先学习一下怎样创建软链接文件&#xff0c;指令格式为&#xff1a;ln -s 被链接的文件 生成的链接文件名 我们可以这样记忆&#xff1a;ln是link的简称&#xff0c;s是soft的简称。 我们在下面的图片中就是给test文件生成了一个软链接mytest&#xff1a; 我们来解…

【 书生·浦语大模型实战营】作业(六):Lagent AgentLego 智能体应用搭建

【 书生浦语大模型实战营】作业&#xff08;六&#xff09;&#xff1a;Lagent & AgentLego 智能体应用搭建 &#x1f389;AI学习星球推荐&#xff1a; GoAI的学习社区 知识星球是一个致力于提供《机器学习 | 深度学习 | CV | NLP | 大模型 | 多模态 | AIGC 》各个最新AI方…

频谱模拟器

频谱模拟器&#xff0c;特别是模拟频谱仪&#xff0c;是一种基于特定原理的频谱分析工具。以下是对其的详细介绍&#xff1a; 工作原理&#xff1a; 模拟频谱仪的工作原理主要基于频率转换原理&#xff0c;包括两个关键步骤&#xff1a;信号混频和滤波分析。 信号混频&#xf…

【Java从入门到精通】Java 异常处理

在 Java 中&#xff0c;异常处理是一种重要的编程概念&#xff0c;用于处理程序执行过程中可能出现的错误或异常情况。 异常是程序中的一些错误&#xff0c;但并不是所有的错误都是异常&#xff0c;并且错误有时候是可以避免的。 比如说&#xff0c;你的代码少了一个分号&…

Python中的enumerate函数详解

在Python编程中&#xff0c;我们经常需要在循环遍历一个序列时同时获取元素的索引和值。为了实现这一需求&#xff0c;Python提供了一个内置的enumerate函数&#xff0c;它能够方便地为我们提供序列中每个元素的索引和值。 enumerate函数 enumerate函数接受两个参数&#xff…