#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int maxn = 3000;
const ll INF = 1e18;
ll mp[maxn][maxn];
void floyd(int n){
for(int k = 1;k <= n;k++){
for(int i = 1;i <= n;i++){
for(int j = 1;j <= n;j++){
mp[i][j] = min(mp[i][j], mp[i][k] + mp[k][j]);
}
}
}
}
int main(){
int n = 2021;
for(int i = 1;i <= n;i++){
for(int j = 1;j <= n;j++){
if(i == j) mp[i][j] = 0;
else if(abs(i - j) <= 21) mp[i][j] = mp[j][i] = i * j / __gcd(i, j);
else mp[i][j] = mp[j][i] = INF;
}
}
floyd(n);
cout << mp[1][2021];
return 0;
}
floyd算法:
void floyd(int n){
for(int k = 1;k <= n;k++){
for(int i = 1;i <= n;i++){
for(int j = 1;j <= n;j++){
mp[i][j] = min(mp[i][j], mp[i][k] + mp[k][j]);
}
}
}
}