//先对数组进行初始化,有连接边的求出两点间的路径长度,再用bfs求最短路径
#include <iostream>
#include <algorithm>
#include <set>
#include <queue>
using namespace std;
const int N = 3000;
int a[N][N];
queue<int> q;
int st[N];//是否到达过这个点
int d[N];//到该点的最短距离
int gcd(int a,int b){
return b ? gcd(b, a % b) : a;
}
int bfs(){
q.push(1);
st[1]=1;
while(q.size()){
int t = q.front();
q.pop();
for (int i = 1; i <= 21;i++){
if(t+i<=2021){
if(st[t+i]==1){
d[t + i] =min(d[t+i],d[t] + a[t][t+i]);
}
else{
st[t + i] = 1;
d[t+i]=d[t] + a[t][t+i];
q.push(t + i);
}
}
}
}
return d[2021];
}
int main()
{
for (int i = 1; i <= 2021; i++)
{
for (int j = 1; j <= 2021; j++)
{
if(abs(i-j)<=21){
int x = i, y = j;
x = max(x, y);
y = min(x, y);
a[i][j] = a[j][i] = i * j / gcd(x, y);
}
}
}
//cout<<a[15][25]<<endl;
//cout<<a[2000][2021]<<endl;
cout << bfs() << endl;
return 0;
}
蓝桥杯-路径
最新推荐文章于 2023-03-14 18:08:41 发布
这篇博客介绍了一种使用广度优先搜索(BFS)算法来寻找数组中两点间最短路径的方法。首先对数组进行初始化,然后通过BFS遍历找到从起点到2021的最短距离。在过程中,博主还实现了计算最大公约数(GCD)的函数,并讨论了如何更新最短路径。
摘要由CSDN通过智能技术生成