只需要求最小公倍数建边,Floyd求最短路即可。
ps:数组要放在全局变量,放到main函数里会作为局部变量导致栈溢出
代码如下(示例):
#include <bits/stdc++.h>
#define ll long long
#define INF 0x3f3f3f3f
using namespace std;
ll gcd(ll a,ll b){
if(a%b==0)
return b;
else
return gcd(b,a%b);
}
long long Edge[2025][2025];
int main(){
memset (Edge,INF,sizeof(Edge));
for(int i=1;i<=2021;i++)
for(int j=1;j<=2021;j++){
if(i==j) Edge[i][j]=0;
else{
if(abs(i-j)<=21){
Edge[i][j]=i*j/gcd(i,j);
}
}
}
for(int k=1;k<=2021;k++)
for(int i=1;i<=2021;i++)
for(int j=1;j<=2021;j++){
if(Edge[i][j]>Edge[i][k]+Edge[k][j])
Edge[i][j]=Edge[i][k]+Edge[k][j];
}
cout<<Edge[1][2021];
return 0;
}