代码随想录算法训练营第59天|卡码网 47. 参加科学大会、94. 城市间货物运输 I

1. 卡码网 47. 参加科学大会

题目链接:https://kamacoder.com/problempage.php?pid=1047
文章链接:https://www.programmercarl.com/kamacoder/0047.参会dijkstra堆.html#总结
在这里插入图片描述

思路依然是 dijkstra 三部曲:
1.第一步,选源点到哪个节点近且该节点未被访问过
2.第二步,该最近节点被标记访问过
3.第三步,更新非访问节点到源点的距离(即更新minDist数组)
只不过之前是 通过遍历节点来遍历边,通过两层for循环来寻找距离源点最近节点。 这次我们直接遍历边,且通过堆来对边进行排序,达到直接选择距离源点最近节点。
优化部分
1.针对稀疏图,从边的角度使用邻接表进行图存储。
2.选源点到哪个节点近且该节点未被访问过。
我们要选择距离源点近的节点(即:该边的权值最小),所以 我们需要一个 小顶堆 来帮我们对边的权值排序,每次从小顶堆堆顶 取边就是权值最小的边。注意:这里的权值是节点到源点的权值,小顶堆需要按照该权值来排序。
小顶堆可以使用优先级队列实现。最小堆中保存着所有未被访问的且权值不是默认最大值的节点。
3.该最近节点被标记访问过
和 朴素dijkstra 一样。
4.更新非访问节点到源点的距离(即更新minDist数组)
和 朴素dijkstra 一样。唯一的区别是因为使用的是邻接表,则可以直接获取到当前最近节点的所有直连节点,而不用同邻接矩阵一样,需要遍历所有节点再判断。

class Edge {int to; // 邻接顶点int val; // 边的权值Edge(int to,int val) {this.to = to;this.val = val;}
}class MyComparison implements Comparator<Pair<Integer,Integer>> {@Overridepublic int compare(Pair<Integer,Integer> a,Pair<Integer,Integer> b) {return Integer.compare(a.second,b.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(); // 公共汽车站数量int m = scanner.nextInt(); // 公路数量List<List<Edge>> grid = new ArrayList<>(n+1);for (int i=0;i<=n;i++) {grid.add(new ArrayList<>());}for (int i=0;i<m;i++) {int p1 = scanner.nextInt();int p2 = scanner.nextInt();int val = scanner.nextInt();grid.get(p1).add(new Edge(p2,val));}int start = 1; // 起点int end = n; // 终点// 存储从源点到每个节点的最短距离int[] minDist = new int[n+1];Arrays.fill(minDist,Integer.MAX_VALUE);// 记录顶点是否被访问过boolean[] visited = new boolean[n + 1];// 优先队列中存放Pair<节点,源点到该节点的权值>PriorityQueue<Pair<Integer, Integer>> pd = new PriorityQueue<>(new MyComparison());// 初始化队列,源点到源点的距离为0,所以初始为0pd.add(new Pair<>(start,0));minDist[start] = 0; // 起始点到自身的距离为0while (!pd.isEmpty()) {// 1. 第一步 选源点到哪个节点近且该节点未被访问过Pair<Integer,Integer> cur = pd.poll();if (visited[cur.first]) continue; // 注意:因为最小堆中会存在多个不同权值的相同节点。当该节点的最小权值节点被取出后,//节点会被标记为被访问true。那么该节点的其他权值节点就无用了,直接跳过。// 2. 第二步,该最近节点被标记访问过visited[cur.first] = true;// 3. 第三步,更新非访问节点到源点的距离for (Edge edge:grid.get(cur.first)) {if (!visited[edge.to] && minDist[cur.first] + edge.val < minDist[edge.to]) {minDist[edge.to] = minDist[cur.first] + edge.val;pd.add(new Pair<>(edge.to,minDist[edge.to])); // 将更新后的距源点的权值的节点加入到最小堆中// 注意:这里并没有删除原来权值的相同节点,而是将新的最小权值作为新的节点加入了最小堆中。// 也就是说最小堆中会存在多个不同权值的相同节点。}}}if (minDist[end] == Integer.MAX_VALUE) {System.out.println(-1);} else {System.out.println(minDist[end]);}}
}

2. 卡码网 94. 城市间货物运输 I

题目链接:https://kamacoder.com/problempage.php?pid=1152
文章链接:https://www.programmercarl.com/kamacoder/0094.城市间货物运输I.html

在这里插入图片描述

思路:
使用Bellman_ford算法
核心思想是 对所有边进行松弛n-1次操作(n为节点数量),从而求得目标最短路。
针对:图中边的权值可以有负数,且不存在任何负权回路的情况(在有向图中出现有向环 且环的总权值为负数)。
对所有边松弛一次,可以计算 起点到达 与起点一条边相连的节点 的最短距离。
对所有边松弛两次,可以计算 起点到达 与起点两条边相连的节点 的最短距离。
对所有边松弛三次,可以计算 起点到达 与起点三条边相连的节点 的最短距离。
若计算起点到终点的最短距离,则需要对边松弛n-1次,其中n为节点数。

import java.util.*;public class Main {public static void main (String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt(); // 城市数量int m = sc.nextInt(); // 道路数量List<List<Integer>> roadList = new ArrayList<>();for (int i=0;i<m;i++) {int s = sc.nextInt();int t = sc.nextInt();int v = sc.nextInt();List<Integer> list = new ArrayList<>();list.add(s);list.add(t);list.add(v);roadList.add(list);}int[] minDist = new int[n+1]; // 记录起点到各个节点的最短距离Arrays.fill(minDist,Integer.MAX_VALUE);minDist[1]=0;// 松弛n-1次for(int j=1;j<n;j++) {// 对所有道路进行分析for(int i=0;i<m;i++) {int from = roadList.get(i).get(0);int to = roadList.get(i).get(1);int value = roadList.get(i).get(2);if (minDist[from] != Integer.MAX_VALUE && minDist[from] + value < minDist[to]) {minDist[to] = minDist[from] + value;}}}if (minDist[n] == Integer.MAX_VALUE) {System.out.println("unconnected");} else {System.out.println(minDist[n]);}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1549203.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Arthas sc(查看JVM已加载的类信息 )

文章目录 二、命令列表2.2 class/classloader相关命令2.2.5 sc&#xff08;查看JVM已加载的类信息 &#xff09;举例1&#xff1a;模糊搜索&#xff0c;xx包下所有的类举例2&#xff1a;打印类的详细信息举例3&#xff1a;打印出类的Field信息 二、命令列表 2.2 class/classlo…

分享了一个支持WIN7的QGIS3.34的版本

上传分享了一个支持WIN7的QGIS3.34的版本&#xff0c;该版本同时也是个轻量级的QGIS&#xff0c;大小轻便、启动速度也快&#xff01;但该版本没有Python及Python插件支持。 需要在WIN7下使用或只使用QGIS3.34核心基本功能的可以使用这个&#xff01;当然这个版本也支持WIN7以上…

ARM 汇编5 数据类型

在ARMv7-M处理器中&#xff0c;Byte对应8bits&#xff0c;Halfword对应16bits, Word对应32bits。 而在展示中&#xff0c;我们通常会使用一位来表示4bits&#xff0c;也就是 1 nibble 4 bits 如下图&#xff0c;一个寄存器中包含8 nibbles&#xff0c;也就是32bits。 关于…

python基础库

文章目录 1.研究目的2.platform库介绍3.代码4.结果展示 1.研究目的 最近项目中需要利用python获取计算机硬件的一些基本信息,查阅资料,.于是写下这篇简短的博客,有问题烦请提出,谢谢-_- 2.platform库介绍 platform 库是 Python 的一个内置库&#xff0c;可以让我们轻松地获取…

SpringBoot教程(安装篇) | Docker Desktop的安装(Windows下的Docker环境)

SpringBoot教程&#xff08;安装篇&#xff09; | Docker Desktop的安装&#xff08;Windows下的Docker环境&#xff09; 前言如何安装Docker Desktop资源下载安装启动&#xff08;重点&#xff09;加入汉化包 设置加速镜像 前言 如果你在 Windows 上&#xff0c;确保 Docker …

短视频电影直播多功能主题第二套Streamlab主题

需要搭配苹果cms使用.本源码只是主题&#xff0c;非整套 适配移动端到32寸显示器&#xff0c;内置6种幻灯片风格&#xff0c;100%DIY布局功能给你自由设计模板的能力&#xff0c;不会代码也能随意修改布局&#xff0c;修改数据显示&#xff0c;拒绝千篇一律的网站风格

Spring Boot助力:小徐影院管理系统

第二章开发技术介绍 2.1相关技术 小徐影城管理系统是在Java MySQL开发环境的基础上开发的。Java是一种服务器端脚本语言&#xff0c;易于学习&#xff0c;实用且面向用户。全球超过35&#xff05;的Java驱动的互联网站点使用Java。MySQL是一个数据库管理系统&#xff0c;因为它…

QQ机器人搭建

使用QQ官方机器人Python SDK和三方框架搭建QQ群聊机器人 文章目录 使用QQ官方机器人Python SDK和三方框架搭建QQ群聊机器人前言编写机器人代码机器人监听群聊进行文字回复机器人监听群聊进行图片回复机器人监听群聊进行文件发送机器人监听群聊进行视频发送机器人监听群聊进行语…

OpenStack Yoga版安装笔记(十四)启动一个实例

1、官方文档 OpenStack Installation Guidehttps://docs.openstack.org/install-guide/ 本次安装是在Ubuntu 22.04上进行&#xff0c;基本按照OpenStack Installation Guide顺序执行&#xff0c;主要内容包括&#xff1a; 环境安装 &#xff08;已完成&#xff09;OpenStack…

20.指针相关知识点1

指针相关知识点1 1.定义一个指针变量指向数组2.指针偏移遍历数组3.指针偏移的补充4.指针和数组名的见怪不怪5.函数、指针、数组的结合 1.定义一个指针变量指向数组 指向数组首元素的地址 指向数组起始位置&#xff1a;等于数组名 #include <stdio.h>int main(){int ar…

不知道孩子用的台灯哪个牌子好?家长买灯看护眼台灯十大排名!

目前中国面临着严峻的近视问题&#xff0c;特别是儿童和青少年群体中的近视率持续升高&#xff0c;已经成为重大的公共卫生挑战。根据最新的数据统计&#xff0c;全国学生近视率居高不下。国家卫生健康委员会为此发布了《近视防治指南&#xff08;2024年版&#xff09;》&#…

VS开发C++项目常用基础属性配置

这篇文件简单讨论一下visual studio中项目属性的常用基础配置。 1.输出目录&#xff1a;项目目标文件生成位置。 2.中间目录&#xff1a;项目生成的中间文件所在的位置。 3.目标文件名&#xff1a;项目生成目标文件名称。 4.附加包含目录&#xff1a;三方库等头文件所在的位…

古老的啤酒酿造技艺:传承与发扬

在人类文明的浩瀚历史中&#xff0c;啤酒酿造技艺源远流长&#xff0c;承载着世代匠人的智慧与匠心。这些古老的技艺&#xff0c;不仅是一种手艺&#xff0c;更是一种文化的传承。今天&#xff0c;我们将一起走进这神秘的酿造世界&#xff0c;探寻古老啤酒酿造技艺的传承与发扬…

Json-Rpc框架(Muduo库快速上手)

阅读导航 引言一、Muduo库简介二、Muduo库常见接口1. TcpServer类基础介绍2. EventLoop类基础介绍3. TcpConnection类基础介绍4. TcpClient类基础介绍5. Buffer类基础介绍 三、Muduo库使用示例⭕英译汉服务器⭕英译汉客户端 引言 在上一篇文章中&#xff0c;我们简要介绍了在项…

https://www.typeframes.com.cn/ AI视频制作如此简单

光映是一个创新的AI驱动视频创作平台&#xff0c;提供多样化工具&#xff0c;用于生成文生视频、图生视频、长视频生成、音乐视频和虚拟形象视频。利用尖端AI技术&#xff0c;轻松制作出符合您创意构想的精彩视频 原创长视频生成&#xff1a; 特点&#xff1a; 智能匹配&#x…

一篇文章教会你使用Python中三种简单的函数

一、函数简介 所谓函数&#xff0c;就是指&#xff1a;把某些特定功能的代码组成为一个整体&#xff0c;这个整体就叫做函数。 这里插播一条粉丝福利&#xff0c;如果你正在学习Python或者有计划学习Python&#xff0c;想要突破自我&#xff0c;对未来十分迷茫的&#xff0c;可…

【步联科技身份证】 身份证读取与解析———未来之窗行业应用跨平台架构

一、身份证解析代码 C# function 身份证数据解析_湖南步联科技(wzxx) {var result {};result[xm] wzxx.substr(0, 15);result[xbdm] wzxx.substr(15, 1);result[mzdm] wzxx.substr(16, 2);result[csrq] wzxx.substr(18, 8);result[dzmc] wzxx.substr(26, 35);result[gms…

Linux权限解析

目录 shell命令以及运行原理 Linux权限概念 切换用户 Linux权限管理 文件访问者分类 文件类型和访问权限 Linux下的文件后缀 文件权限值的表示方法 文件访问权限的相关设置方法 文件掩码 目录权限 粘滞位 目录权限总结 关于权限的总结 shell命令以及运行原理 Linu…

如何配置flutter(超详细的哦)

目录 首先先去官网下载zip包 下载下来之后就是解压 配置环境变量 winr查看是否配置成功 解决报错 [!] Android toolchain - develop for Android devices (Android SDK version 35.0.0)X cmdline-tools component is missing Android license status unknown 首先先去官…

C. Cards Partition 【Codeforces Round 975 (Div. 2)】

C. Cards Partition 思路&#xff1a; 可以O(n)直接判断&#xff0c;牌组从大到小依次遍历即可。 不要用二分答案&#xff0c;因为答案不一定是单调的 代码: #include <bits/stdc.h> #define endl \n #define int long long #define pb push_back #define pii pair<…