7-5 单源最短路径

7-5 单源最短路径

请编写程序求给定正权有向图的单源最短路径长度。图中包含n个顶点,编号为0至n-1,以顶点0作为源点。

输入格式:

输入第一行为两个正整数n和e,分别表示图的顶点数和边数,其中n不超过20000,e不超过1000。接下来e行表示每条边的信息,每行为3个非负整数a、b、c,其中a和b表示该边的端点编号,c表示权值。各边并非按端点编号顺序排列。

输出格式:

输出为一行整数,为按顶点编号顺序排列的源点0到各顶点的最短路径长度(不含源点到源点),每个整数后一个空格。如源点到某顶点无最短路径,则不输出该条路径长度。

输入样例:

4 4
0 1 1
0 3 1
1 3 1
2 0 1

输出样例:

1 1 

简化版代码

#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
using PII = pair<int, int>;const int INF = 0x3f3f3f3f;
const int N = 2e4 + 10;vector<pair<int, int>> mp[N];
bool vis[N];
int dis[N];int main()
{memset(dis, INF, sizeof dis);int n, m;scanf("%d %d", &n, &m);for (int i = 0; i < m ;++i) {int u, v, w;scanf("%d %d %d", &u, &v, &w);mp[u].push_back({v, w});}priority_queue<PII, vector<PII>, greater<PII>> q;dis[0] = 0;q.push({0, 0});while (q.size()) {auto [d, u] = q.top();q.pop();if (vis[u]) continue;dis[u] = d;vis[u] = true;for (auto [v, w] : mp[u]) {if (dis[v] < dis[u] + w) continue;dis[v] = dis[u] + w;q.push({dis[v], v});}}for (int i = 1; i < n; ++i) {if (dis[i] == INF) continue;printf("%d ", dis[i]);}return 0;
}

中文注释版代码

#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
using PII = pair<int, int>;const int INF = 0x3f3f3f3f;
const int N = 2e4 + 10;vector<pair<int, int>> mp[N];  // 邻接表存储图的边权信息
bool vis[N];  // 记录节点是否已经被访问
int dis[N];  // 记录源点到各个节点的最短距离int main()
{memset(dis, INF, sizeof dis);  // 初始化距离数组为无穷大int n, m;scanf("%d %d", &n, &m);// 输入边的信息并构建邻接表for (int i = 0; i < m ;++i) {int u, v, w;scanf("%d %d %d", &u, &v, &w);mp[u].push_back({v, w});}priority_queue<PII, vector<PII>, greater<PII>> q;  // 小顶堆存储节点距离信息dis[0] = 0;  // 源点到自身的距离为0q.push({0, 0});  // 将源点加入堆中while (q.size()) {auto [d, u] = q.top();q.pop();if (vis[u]) continue;  // 如果节点已经被访问过,则跳过dis[u] = d;  // 更新最短距离vis[u] = true;  // 标记节点已经被访问// 遍历与当前节点相邻的节点for (auto [v, w] : mp[u]) {if (dis[v] < dis[u] + w) continue;  // 如果新的路径没有更短,则跳过dis[v] = dis[u] + w;  // 更新最短距离q.push({dis[v], v});  // 将新的节点加入堆中}}// 输出从源点到各个节点的最短距离for (int i = 1; i < n; ++i) {if (dis[i] <span style="font-weight: bold;" class="mark"> INF) continue;  // 如果无法到达该节点,则跳过printf("%d ", dis[i]);}return 0;
}

java版代码(有问题)

注意:运行超时,如果有谁的java代码过了,可以给发在评论区或私信我==

import java.util.ArrayList;
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.Scanner;public class Main {static class Pair implements Comparable<Pair> {Integer key;Integer value;public Pair(Integer key, Integer value) {this.key = key;this.value = value;}@Overridepublic int compareTo(Pair o) {return this.value - o.value;}}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();int m = scanner.nextInt();int[] dis = new int[n];  // 记录源点到各个节点的最短距离Arrays.fill(dis, Integer.MAX_VALUE);  // 初始化距离数组为无穷大boolean[] vis = new boolean[n];  // 记录节点是否已经被访问ArrayList<Pair>[] mp = new ArrayList[n];  // 邻接表存储图的边权信息for (int i = 0; i < n; ++i) {mp[i] = new ArrayList<>();}// 输入边的信息并构建邻接表for (int i = 0; i < m; ++i) {int u = scanner.nextInt();int v = scanner.nextInt();int w = scanner.nextInt();mp[u].add(new Pair(v, w));}PriorityQueue<Pair> q = new PriorityQueue<>();  // 小顶堆存储节点距离信息dis[0] = 0;  // 源点到自身的距离为0q.add(new Pair(0, 0));  // 将源点加入堆中while (!q.isEmpty()) {Pair pair = q.poll();int d = pair.key;int u = pair.value;if (vis[u]) continue;  // 如果节点已经被访问过,则跳过dis[u] = d;  // 更新最短距离vis[u] = true;  // 标记节点已经被访问// 遍历与当前节点相邻的节点for (Pair edge : mp[u]) {int v = edge.key;int w = edge.value;if (dis[v] < dis[u] + w) continue;  // 如果新的路径没有更短,则跳过dis[v] = dis[u] + w;  // 更新最短距离q.add(new Pair(dis[v], v));  // 将新的节点加入堆中}}// 输出从源点到各个节点的最短距离for (int i = 1; i < n; ++i) {if (dis[i] == Integer.MAX_VALUE) continue;  // 如果无法到达该节点,则跳过System.out.print(dis[i] + " ");}}
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

32为Linux安卓AVD启动报错

2019独角兽企业重金招聘Python工程师标准>>> 当使用android的AVD时提示以下错误&#xff1a;Starting emulator for AVD NexusOne ERROR: 32-bit Linux Android emulator binaries are DEPRECATED, to use them you will have to do at least one of the following:…

hdu 2007 - 平方和与立方和

题目大意&#xff1a; 给定一段连续的整数&#xff0c;求出他们中所有偶数的平方和以及所有奇数的立方和。 解答&#xff1a; 坑你没商量&#xff01;要考虑输入数a,b的大小。如果a>b,需要交换a&#xff0c;b的值。转载于:https://www.cnblogs.com/ZJUT-jiangnan/p/3613488.…

(原创)优酷androidclient 下载中 bug 解决

在网络情况不好的情况下&#xff0c;优酷androidclient下载视频会终止&#xff0c;用户放弃下载点击 删除该任务以后&#xff0c;切换到网络好的情况下进行下载&#xff0c;会显示该视频已在下载队列里&#xff0c;然后clientUI界面却什么都看不到。导致用户根本无法下载。 事实…

填问卷,得《2015中国呼叫中心知识库现状与问题报告》

为了解中国呼叫中心知识库运营现状和存在的主要问题&#xff0c;掌握呼叫中心知识库的总体发展水平&#xff0c;中国知识管理中心&#xff08;KMCenter&#xff09;面向全国呼叫中心发起“2015中国呼叫中心知识库现状与问题调研”活动&#xff0c;主要通过问卷调研和典型用户访…

C语言经典算法100例-031-判断星期几

题目如下&#xff1a; 请输入星期几的第一个字母来判断一下是星期几&#xff0c;如果第一个字母一样&#xff0c;则继续判断第二个字母。 比较简单&#xff0c;直接看程序吧。 #include <stdio.h> #include <stdlib.h> #include <conio.h> int main() {char …

ARM汇编的特点

以下内容源于网络资源的学习与整理&#xff0c;如有侵权请告知删除。 一、LDR/STR架构 ARM采用RISC架构&#xff0c;CPU本身不能直接读取内存&#xff0c;需要先将内存中的内容加载到CPU的通用寄存器中才能被CPU处理。换言之&#xff0c;寄存器是CPU和内存进行数据交换的中介。…

持久代是方法区还是堆中的?

2019独角兽企业重金招聘Python工程师标准>>> 昨天跟一哥们讨论&#xff0c;持久代在方法区&#xff0c;属不属于堆中的? 它的意思是持久代不属于堆,属于方法区&#xff0c;而我则认为持久代属于方法区也属于堆。 结果今天上网一查,还真的是。下面是解释: 持久代”仅…

妈的我好像发现是哪出问题了

我不能被这个破玩意卡这么久。 今晚的第一个收获是&#xff0c;我在下载方法里面&#xff0c;获取了API写完了文件而且关闭了之后又加上了一段代码用来测试。 内容是打开刚刚写好的文件&#xff0c;把里面的内容打印到日志上&#xff0c;结果我发现不但文件存在&#xff0c;而且…

Web 前端攻防(2014版)-baidu ux前端研发部

http://fex.baidu.com/articles/page2/ Web 前端攻防&#xff08;2014版&#xff09; zjcqoo | 20 Jun 2014禁止一切外链资源 外链会产生站外请求&#xff0c;因此可以被利用实施 CSRF 攻击。 目前国内有大量路由器存在 CSRF 漏洞&#xff0c;其中相当部分用户使用默认的管理账…

plsqlnbsp;分页

select * from (select rownum rn,ps.* from (select * from user_t) ps ) where rn>1 and rn<10 //从第一页开始&#xff0c;第十行结束版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 转载于:https://www.cnblogs.com/jamesf/p/4751701.ht…

Silverlight动态设置WCF服务Endpoint

2013-02-02 05:57 by jv9, 1763 阅读, 3 评论, 收藏, 编辑 去年12月收到一位朋友的邮件&#xff0c;咨询Silverlight使用WCF服务&#xff0c;应用部署后一直无法访问的问题&#xff0c;通过几次交流&#xff0c;才发现在他的项目中&#xff0c;全部使用静态URL作为WCF服务的End…

SqlServer 的IDENTITY_INSERT设置为OFF问题

其实是表的主键设为GenerationType.AUTO 为自动写入 只要手动填写其他字段的值就可以&#xff0c;不需要写主键值&#xff08;否则不能添加数据&#xff09; 也可以尝试set IDENTITY_INSERT 表名 on 转载于:https://www.cnblogs.com/fengyu9/p/3620942.html

第6季2:基于RTSP协议的实时视频流传输的源码分析

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 前言 博文第一季2&#xff1a;HI3518EV200的初体验中&#xff0c;所提供的测试文件sample_venc实现了基于RTSP协议的实时视频流传输功能。当时直接提供了二进制文件&#xff0c;现在我们来分析其对…

安卓获取星期几

Date t new Date();int day t.getDay();switch (day) {case 0:break;case 1:break;case 2:break;case 3:break;case 4:break;case 5:break;case 6:break;}转载于:https://blog.51cto.com/luoguoxin/1613493

MemCached的telnet命令行参数

1、启动Memcache 常用参数 -p <num> 设置TCP端口号(默认不设置为: 11211) -U <num> UDP监听端口(默认: 11211, 0 时关闭) -l <ip_addr> 绑定地址(默认:所有都允许,无论内外网或者本机更换IP&#xff0c;有安全隐患&#xff0c;若设置为127.0.0.1…

Kernel Memory Layout on ARM Linux

这是内核自带的文档&#xff0c;讲解ARM芯片的内存是如何布局的&#xff01;比较简单&#xff0c;对于初学者可以看一下&#xff01;但要想深入理解Linux内存管理&#xff0c;建议还是找几本好书看看&#xff0c;如深入理解Linux虚拟内存&#xff0c;嵌入系统分析&#xff0c;L…

第4季3:Hi3518e的sensor接口引脚复用设置(load3518e文件)

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 在第2、3季的内容中&#xff0c;在板载系统的配置脚本即/etc/profile文件中&#xff0c;都有如下这句代码&#xff1a; ./load3518e -i -sensor ar0130 -osmem 32 -total 64 在第4季1&#xff1a…

iOS游戏开发 几个有利工具

2019独角兽企业重金招聘Python工程师标准>>> iOS游戏开发 几个有利工具 本文介绍的是iOS游戏开发 几个有利工具&#xff0c;为友们介绍几款开发工具&#xff0c;游戏爱好者记住了&#xff01;先来看内容。 AD&#xff1a; iOS游戏开发 几个有利工具是本文要介绍的内…

关于editor网页编辑器ueditor.config.js 配置图片上传

最近公司项目在做一个门户网站&#xff0c;其中新闻和简介等部分使用到了ueditor编辑器&#xff0c;但是上级明确指示需要图片上传这个功能&#xff0c;这时却发现图片上传功能不能正常使用&#xff0c;上传时一直报错&#xff0c;网上收了好几个处理办法&#xff0c;都说的不够…

[歪谈]拽一个贵人出来给你当炮架子

[歪谈]拽一个贵人出来给你"当炮架子" 我们在古装神话剧中经常会听到某个“先知”对前来算命的人说&#xff1a;你会在某某时刻遇到你的贵人。而这个贵人会在事业上助你一臂之力。 这里有个问题&#xff1a;贵人到底是什么&#xff1f;我们怎样去寻找我们的贵人。 前几…