两种解法:
djkstra(堆优化了)
floyd(比较慢要多跑一会不过比较好写)
#include<iostream>
#include<vector>
#include<algorithm>
#include<set>
#include<map>
#include<unordered_set>
#include<unordered_map>
#include<queue>
#include<deque>
#include<cstring>
#include<cmath>
#define x first
#define y second
using namespace std;
typedef pair<int,int> PII;
const int N = 2100;
vector<vector<PII>> g(N);
long long dis[N];
long long f[N][N];
bool book[N];
int gcd(int a,int b){
return b?gcd(b,a%b):a;
}
void djkstra(){
memset(f,0x3f,sizeof f);
for(int i = 1; i <= 2021; i++)
for(int j = 1; j <= 2021; j++)
if(abs(i-j) <= 21){
int d = i*j/gcd(i,j);
g[i].push_back({j,d});
g[j].push_back({i,d});
}
memset(dis,0x3f,sizeof dis);
dis[1] = 0;
priority_queue<PII,vector<PII>,greater<PII>> que;
que.push({dis[1],1});
int ans = 0;
while(que.size()){
auto tmp = que.top();
que.pop();
if(book[tmp.y]) continue;
book[tmp.y] = true;
for(auto node:g[tmp.y]){
if(book[node.x]) continue;
if(dis[node.x] > dis[tmp.y] + node.y){
dis[node.x] = dis[tmp.y] + node.y;
que.push({dis[node.x],node.x});
}
}
}
cout<<dis[2021];
}
void floyd(){
memset(f,0x3f,sizeof f);
for(int i = 1; i <= 2021; i++)
for(int j = 1; j <= 2021; j++)
if(abs(i-j) <= 21){
int d = i*j/gcd(i,j);
f[i][j] = f[j][i] = d;
}
for(int k = 1; k <= 2021; k++){
for(int i = 1; i <= 2021; i++)
for(int j = 1; j <= 2021; j++){
if(f[i][j] > f[i][k] + f[k][j]) {
f[i][j] = f[i][k] + f[k][j];
}
}
}
cout<<f[1][2021];
}
int main(){
djkstra();
// floyd();
return 0;
}