DS图应用--最短路径

Description

给出一个图的邻接矩阵,再给出指定顶点v0,求顶点v0到其他顶点的最短路径

Input

第一行输入t,表示有t个测试实例

第二行输入n,表示第1个图有n个结点

第三行起,每行输入邻接矩阵的一行,以此类推输入n行

第i个结点与其他结点如果相连则为1,无连接则为0,数据之间用空格隔开

第四行输入v0,表示求v0到其他顶点的最短路径距离

以此类推输入下一个示例

Output

每行输出v0到某个顶点的最短距离和最短路径

每行格式:v0编号-其他顶点编号—-[最短路径],具体请参考示范数据

Sample

#0
Input

Copy

1
5
0 5 0 7 15
0 0 5 0 0
0 0 0 0 1
0 0 2 0 0
0 0 0 0 0
0
Output

Copy

0-1-5----[0 1 ]
0-2-9----[0 3 2 ]
0-3-7----[0 3 ]
0-4-10----[0 3 2 4 ]

dijkstra求单源最短路径:

可以先参考这篇文章,单纯的dijkstra算法求最短距离,还不用记录路径

        tips:本题要记录最短路径所经过的点

以起点 A 通往前一个点 B 的最短路径+前一个点 B 到下一个点 C 的路径与 现有的A通到C的路径距离相比较求一个最短的路劲。(这里可能不是太理解,请往下看)
首先先知道一个算法里面一个重要的东西 dis[] 数组,他的意思是起点到终点的距离
设起点为 0 
dis[0],起点 0 到 0 的最短距离
dis[1],起点 0 到 1 的最短距离
dis[2],起点 0 到 2 的最短距离

这里与开头说的联系;
假设 0 到 2 存在一条路距离为10 ,0 到 1 存在一条路距离为2 ,1到2存在一条路距离为3


dis[0]=0
dis[1]=2

此时 0 到 1 的路径是 0-1
然后最开始以 2 为前一个出发点,那到达  2  的最短距离已知的是不是10,dis[2]=10

此时 0 到 2 的路径是 0-2
然后 1 为中转点到达 2 的时候,到达2的距离是不是 到达 1 的距离+ 1 到 2的距离dis[1]+1->2=5
此时dis[1]+3<dis[2]=10
所以dis[2]更新为dis[2]=dis[1]+3

此时路径我们发现 0-2 走的路径比 0-1-2 走的长,所以我们就更新路径
所以 0 到 2 的最短路径为 0-1-2

路径:

起点 0 到 1,最短路径就是 0-1

起点 0 到 2,最短路径就是 0-1-2
起初我们记录的 0 到 2的路径是 0-2,但是我们发现走 0-1-2这条路更近,所以取而代之 

样例(自己出的样例跑一遍)

tips:这里我们记录start到dis[i]的最短路径是不包括i本身的
例如:A到C的最短路径是A-B-C,那我们记录的就只有A-B

dis[A]=无穷大 dis[B]=无穷大 dis[C]=无穷大,dis[D]=无穷大
本题设置A为起点
图如下:

令dis[]都为无穷大

令起点到自己为0,因为自己到自己距离为0嘛

然后dis[]数组中dis[A]是最小的,且没有被作为中转点走过,所以设A为中转点,然后遍历A可以到达的边。这里可以理解为A-A(中转点)-目标点
A可以到达B,C两点,且A到B,C的距离小于无穷大,所以更新起点A到B,C的最短距离为
dis[B]=2,dis[C]=3

此时A到B的最短路径为A
此时A到C的最短路径为A

✔的意思是这个点已经被作为中转点走过了

然后找未被作为起始点且起点到他的距离最短,找到B,因为dis[B]=2,dis[C]=3,dis[A]=0但是A已经作为中转点走过了。
B可以到达D点,
起初dis[D]=无穷大,意思为A到D的最短距离为无穷
现在D的路径有从B到D,他的距离为起点A到达B的最短距离+BD路径的距离
dis[B]+BD=12<无穷大
所以dis[D]=12

此时A到D的最短路径为A-B

然后继续重复步骤
此时没有被走过的点是C,D.dis[C]=3,dis[D]=12
1.C可以到达B
起点A到C的最短距离+CB为B的新一条路距离>dis[B]的前一个路径,即起点A到B的最短路径
dis[C]+CB=8 > dis[B]=2
所以不用更新dis[B]
2.C可以到达D
起点A到D的最短距离+CD为D的新一条路距离<dis[D]的前一个路径,即起点A到D的最短路径
dis[C]+CD=9 > dis[B]=12
所以需要更新起点A到D的最短距离dis[D]=9

此时A到D的路径 A-B的长度大于走A-C的长度
所以更新D的路径为A-C

tips:更新的方法是我们前面已经保存了A到C的路径(不包括C自己),就是路径A,那我们是不是在路径A里面加入要走的C就可以了,就是A-C

最后以D为中转点走,即A到D的最短路径 出发去别的点,但是已经没有D可以到达的点了,所以就结束了

最后得到起点A到别的点的距离
dis[A]=0
dis[B]=2
dis[C]=3
dis[D]=9

最后我们start到各点的最短路径是:

B:A
C:A
D:A-C

最后我们输出实际路径的时候输出完路径再输出终点本身就好了

更新路径的写法:

为什么要清除之前的路径呢。

就比如 A-B-C-D要走10m
但是     A-E-F-D要走5m
那你的最短路径是不是从A到C的最短路径+D变成A到E的最短路径+D
那就把A到C的路径删掉,然后换成A到F的最短路径然后+D

tips:本人写法的最短路径是不包括其本身的
所以A到C的最短路径就是A-B,A到F的最短路径是A-E
所以A到D更新前的路径是A-B-C
更新后的是A到F的最短路径A-E加上F,就是A-E-F

enmmm,意思是到end之前最短路径所经过的点,就是不包括end。
那我求end的最短路径是不是end-1之前最短路径所经过的点加end-1这个点

具体代码实现:

#include <iostream>
#include <vector>
#include <algorithm>
#include <string.h>
using namespace std;
int t, n, start;
const int maxn = 2e3 + 10;
int dp[maxn][maxn];//建立的邻接矩阵数组
vector<int>p[maxn];///二维动态数组,记录p[i],起点start到i所需要经过的路径
int vis[maxn];///判断这个点是否有被中转过
int dis[maxn];///dis[i],表示起点start到终点i的最小距离
void irit()
{for (int i = 0; i < n; i++){vis[i] = 0;///初始化都没有被作为中转点过dis[i] = 0x3f3f3f;///初始化全都是无穷大,start到i的最短距离为无穷大}
}
void dijkstra()
{dis[start] = 0;///start到start自己的最短距离是0for (int i = 0; i < n; i++)///  总共需要n个中转点,次数也是n就够了{int minm = 0x3f3f3f, pre = 0;///for (int j = 0; j < n; j++)///遍历所有dis[],找最小距离的点且没有被作为中转点走过的点{//vis[k]=0即没有被作为中转点,dis[k]即比较dis距离找距离最小的点if (!vis[j] && dis[j] < minm){minm = dis[j];//更新最短距离pre = j;//找距离最小的点}}vis[pre] = 1;///将这个点设置为已经被中转过了for (int j = 0; j < n; j++)///找这个中转点可以到达的k点,如果起点到K的距离小于通过中转点到K的距离就不用更新{///如果起点到K的距离大于通过中转点到K的距离就需要更新///dp[j][k],j到k是否存在边if (dp[pre][j] != 0 && dis[j] > dis[pre] + dp[pre][j]){dis[j] = dis[pre] + dp[pre][j];int len = p[pre].size();p[j].clear();///把到j的前一个路径清除for (int k = 0; k < len; k++)///将start到pre的路径复制下来{p[j].push_back(p[pre][k]);}p[j].push_back(pre);///然后加入pre点}///这么干的原因是,上一条路径的长度走的比经过pre中转的点长///那我们就走pre走过的点作为路径,不是比前一条路更短吗}}
}
int main()
{cin >> t;while (t--){cin >> n;irit();memset(dp, 0, sizeof(dp));for (int i = 0; i < n; i++){for (int j = 0; j < n; j++){cin >> dp[i][j];//构建邻接矩阵}}cin >> start;///输入起点dijkstra();for (int i = 0; i < n; i++){if (i == start)continue;cout << start << "-" << i << "-" << dis[i] << "----";cout << "[";int len = p[i].size();for (int j = 0; j < len; j++)///输出到j所走过最短路径的点,这个点是不包括他自身的{cout << p[i][j] << " ";}cout << i << " ]" << endl;///输出j自身}}return 0;
}

就写到这吧,跟我的追星dijkstra追星还是不说一模一样但也十有八九
原理其实是一样的,但是重要的是掌握我的路径数组的意思,是不包括最后终点自身的

幸苦大家看这么多字了!

夜深了,晚安各位!!!!( ̄o ̄) . z Z

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

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

相关文章

Hello World!

一、minist数据集 深度学习编程特有的hello world程序&#xff1a;采用minist数据集完成意向特定深度学习项目 1、minist数据集介绍 MNIST数据集是一个广泛使用的手写数字识别数据集&#xff0c;它包含了许多不同人手写的数字图片。这个数据集被广泛用于研究手写数字识别&…

通过keepalived+nginx实现 k8s apiserver节点高可用

一、环境准备 K8s 主机配置&#xff1a; 配置&#xff1a; 4Gib 内存/4vCPU/60G 硬盘 网络&#xff1a;机器相互可以通信 k8s 实验环境网络规划&#xff1a; podSubnet&#xff08;pod 网段&#xff09; 10.244.0.0/16 serviceSubnet&#xff08;service 网段&#xff09;: 1…

【S32K3环境搭建】-0.2-安装S32DS product updates和 packages

目录 1 安装S32DS product updates和 packages 1.1 方法一&#xff1a;通过S32DS Extensions and Updates安装product updates和 packages 1.2 方法二&#xff1a;通过Install New Software…安装product updates和 packages 2 S32DS product updates和 packages安装后的效…

海外服务器和国内服务器有什么样的区别呢

海外服务器和国内服务器有什么样的区别呢&#xff0c;其实呢在外形方面是大同小异&#xff0c;除了外形还有一些其他方面还存在这一些差异。 一&#xff0c;地理位置的差异。 海外服务器——有可能在中国数据中心之外的任何国家地区&#xff0c;例如美国服务器&#xff0c;韩…

视频汇聚/音视频流媒体视频平台/视频监控EasyCVR分享页面无法播放,该如何解决?

国标GB28181安防视频监控/视频集中存储/云存储EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统…

PRCD-1229 : An attempt to access configuration of database

今天维护oda一体机时&#xff0c;发现无法在grid用户下面关闭数据库实例&#xff0c;如下 ASM1:/home/gridoda0>srvctl stop database -d orcl -o immeidate PRCD-1229 : An attempt to access configuration of database orcl was rejected because its version 11.2.0.4.…

dockerdesktop推送镜像到dockerhub

1.查看镜像(打开powershell) docker ps2.打tag docker tag pengzx/aspnetcoredocker:v1 pengzx/aspnetcoredocker:v2pengzx/aspnetcoredocker:v1:本地的镜像名加版本号 pengzx/aspnetcoredocker:v2&#xff1a;需要上传的镜像名&#xff08;要以dockerhub的用户名开头/本地镜像…

软著项目推荐 深度学习的智能中文对话问答机器人

文章目录 0 简介1 项目架构2 项目的主要过程2.1 数据清洗、预处理2.2 分桶2.3 训练 3 项目的整体结构4 重要的API4.1 LSTM cells部分&#xff1a;4.2 损失函数&#xff1a;4.3 搭建seq2seq框架&#xff1a;4.4 测试部分&#xff1a;4.5 评价NLP测试效果&#xff1a;4.6 梯度截断…

【工作生活】汽车电子嵌入式开发简介

目录 1. 目标 2. 要分享什么 3.1 行业知识 3.1.1车载行业知识&#xff1a; 3.1.2项目&#xff1a; 3.1.3开发测试工具&#xff1a; 3.2 硬件平台 3.3 基础知识 3.4 工作生活 3. 我们是谁 1. 目标 随着新能源汽车的快速崛起&#xff0c;汽车电子行业开始快速发展&…

掌控安全 暖冬杯 CTF Writeup By AheadSec

本来结束时发到了学校AheadSec的群里面了的&#xff0c;觉得这比赛没啥好外发WP的&#xff0c;但是有些师傅来问了&#xff0c;所以还是发一下吧。 文章目录 Web签到&#xff1a;又一个计算题计算器PHP反序列化又一个PHP反序列化 Misc这是邹节伦的桌面背景图什么鬼&#xff1f;…

基于STM32 HAL库的光电传感器驱动程序实例

本文将使用STM32 HAL库编写一个光电传感器的驱动程序示例。首先&#xff0c;我们会介绍光电传感器的工作原理和应用场景。然后&#xff0c;我们将讲解如何选择合适的STM32芯片和光电传感器组合。接下来&#xff0c;我们会详细介绍使用STM32 HAL库编写光电传感器驱动程序的基本步…

Kafka 生产者 API 指南:深入理解生产者的实现与最佳实践

Kafka 是一个高性能、分布式的消息中间件系统&#xff0c;而其生产者 API 是连接应用程序与 Kafka 集群之间的纽带。本篇博客将深入探讨 Kafka 生产者 API 的核心概念、用法&#xff0c;以及一些最佳实践&#xff0c;帮助你更好地利用 Kafka 构建可靠的消息生产系统。 1. Kafk…

一:对爬虫的简单认识

一&#xff1a;爬虫前导知识 1.爬虫引入&#xff1a; ​ 网络爬虫又称为网络蜘蛛&#xff1b;网络蚂蚁&#xff1b;网络机器人等&#xff0c;可以自动高效地从互联网的海量信息中浏览获取到我们感兴趣的信息&#xff0c;在浏览信息的时候需要按照我们制定的规则进行&#xff…

解决:docx.opc.exceptions.PackageNotFoundError: Package not found at ‘xxx’

解决&#xff1a;docx.opc.exceptions.PackageNotFoundError: Package not found at ‘xxx’ 文章目录 解决&#xff1a;docx.opc.exceptions.PackageNotFoundError: Package not found at ‘xxx’背景报错问题报错翻译报错位置代码报错原因解决方法参考内容今天的分享就到此结…

基础课17——任务问答引擎

任务问答引擎在智能客服系统中负责多轮对话的对话流设计、意图的管理、任务流的执行等功能。能够高效地进行意图识别与任务解析&#xff0c;实现多轮对话的流程设计&#xff0c;并驱动多轮会话任务的高效完成。 1.定义 任务问答引擎负责多轮对话的对话流设计、意图的管理、任…

如何选呼叫中心的语音通道?

如何选呼叫中心的语音通道&#xff1f; 在公网语音线路和专线语音线路中&#xff0c;选择合适的语音通道类型需要根据呼叫中心的实际需求进行综合考虑。 如果呼叫中心的预算有限&#xff0c;或者对语音质量和稳定性的要求不高&#xff0c;可以选择公网语音线路。如果需要更高…

dante(centos)安装

下载安装包 https://www.inet.no/dante/doc/latest/config/index.html 下载软件 解压 tar -zxvf dante-1.4.3.tar.gz 或者 wget http://www.inet.no/dante/files/dante-1.4.3.tar.gz tar -xvzf dante-1.4.3.tar.gz 编译 cd dante-1.4.3 yum install gcc make -y ##编译必备 …

OpenCV-Python:计算机视觉框架

目录 1.背景 2.早期计算机视觉框架 3.当前主流框架 4.计算机视觉框架的未来趋势 5.知识笔记 1.背景 俗话说“工欲善其事必先利其器”&#xff0c;想要学好计算机视觉&#xff0c;需要借助于相关的计算机视觉库&#xff0c;这样在进行学习的时候可以达到事半功倍的效果。 …

使用python的opencv实现人脸识别

简介&#xff1a;本项目主要使用python语言&#xff0c;主要的模块库有os&#xff0c;opencv-python&#xff0c;opencv-contrib-python。项目主要分为三个部分&#xff0c;人脸录入&#xff0c;训练数据&#xff0c;实现人脸的识别。本博客包含源代码&#xff0c;以及各个功能…

MVC、MVP、MVVM模式的区别

前言&#xff1a;这三个表现层框架设计模式是依次进化而形成MVC—>MVP—>MVVM。在以前传统的开发模式当中即MVC模式&#xff0c;前端人员只负责Model&#xff08;数据库&#xff09;、 View&#xff08;视图&#xff09;和 Controller /Presenter/ViewModel&#xff08;控…