这是本蒟蒻的第四篇题解
这次我们要讲的题是寻宝之路,本题也是用的最短路径
题目原网址: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++)