寻宝之路题解

本文是作者的第四篇题解,探讨的是如何解决寻宝之路问题,主要涉及最短路径算法。首先介绍了超时的O(n^2*m)解法,然后详细阐述了正确解法——O(n^3)的迪杰斯特拉算法,通过预处理连边,分步求解路径长度。此外,还定义了相关变量和数组,并提供了主函数和迪杰斯特拉算法的简要说明。
摘要由CSDN通过智能技术生成

这是本蒟蒻的第四篇题解

这次我们要讲的题是寻宝之路,本题也是用的最短路径

题目原网址:https://begin.lydsy.com/JudgeOnline/problem.php?id=1662&csrf=5fa301de3e63b4800a9adcbf94e79db5

关于算法的思考

本题有两种想法:

超时解法:

先处理好连边,然后在输入队列的时候边读边求最短路径(比如队列长为3,分别为[1,2,3],先读入1和2,求一次1和2之间的最短路径,再读入3,求一次2和3之间的最短路径),这样时间复杂度为O(n^2*m),显然超时

正解:

先处理好连边,在求n次最短路径,保存好第i个点到第j个点的最短路径长度,在读入队列,边读边加,最后输出,这样时间复杂度为O(n^3),可以通过

变量定义

int n,m,s,t,opq,dl[12000],lis[1200][1200],zj[1200],zdl[1100][1100],maxx=65536000,ans=0;
bool flag[1200];
变量篇:

int类型:n表示点数,m表示队列长度,s表示最短路径的源点,t表示最短路径的终点,opq是输入变量(是临时输入用的),maxx用于保存无限大,ans存储答案

数组篇:

int类型:dl数组用于存储队列,lis[i][j]表示从i点出发到j点的连边长度(无连边则为无限大),zj数组是迪杰克斯拉算法所需的数组,zdl[i][j]表示从i点出发到j点最短路径的长度(无路径则为无限大)
bool类型:flag数组用于标记某个点是否被走过

主函数部分

int main()
{
   
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)scanf("%d",&dl[i]);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			lis[i][j]=maxx;
	for(int i=1;i<=n;i++)
		
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值