方法1用Floyd算法来写,emm算的很慢但是可以算出来,大概1min出结果。对于不太会写最短路算法的小白很友好。这个题是结果填空题,时间无所谓了🍺时间复杂度为O(n^3),操作次数大概是8*10^9
答案:10266837
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int g[2030][2030];
int gcd(int x,int y)
{
return y?gcd(y,x%y):x;
}
int lcm(int x,int y)
{
return x*y/gcd(x,y);
}
int main()
{
for(int i=1;i<=2021;i++)
{
for(int j=1;j<=2021;j++)
{
if(i==j)
g[i][j]=0;
else
g[i][j]=0x3f3f3f3f;
}
}
for(int i=1;i<=2021;i++)
{
for(int j=1;j<=2021;j++)
{
if(abs(i-j)<=21)
{
g[i][j]=g[j][i]=lcm(i,j);
}
}
}
for(int k=1;k<=2021;k++)
{
for(int i=1;i<=2021;i++)
{
for(int j=1;j<=2021;j++)
{
// if(i!=j)
g[i][j]=min(g[i][j],g[i][k]+g[k][j]);
}
}
}
cout<<g[1][2021]<<endl;
return 0;
}
下面是用spfa算法来写,时间复杂度为O(n*m)对于此题操作次数大概就是10^8左右
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1000010;
int e[N],ne[N],h[N],idx,w[N];
int book[N];
int d[N];
int gcd(int x,int y)
{
return y?gcd(y,x%y):x;//1/是%号
}
int lcm(int x,int y)
{
return x*y/gcd(x,y);
}
void add(int a,int b,int c)
{
e[idx]=b;
ne[idx]=h[a];
w[idx]=c;
h[a]=idx++;
}
void spfa()
{
memset(d,0x3f3f3f3f,sizeof(d));
queue<int>q;
q.push(1);
book[1]=1;
d[1]=0;
while(q.size())
{
int t=q.front();
q.pop();
book[t]=0;
for(int i=h[t];i!=-1;i=ne[i])
{
int j=e[i];
if(d[j]>d[t]+w[i])
{
d[j]=d[t]+w[i];
if(book[j]==0)
{
q.push(j);
book[j]=1;
}
}
}
}
cout<<d[2021]<<endl;
}
int main()
{
memset(h,-1,sizeof(h));
for(int i=1;i<=2021;i++)
{
for(int j=1;j<=2021;j++)
{
if(abs(i-j)<=21)
{
add(i,j,lcm(i,j));
//g[i][j]=g[j][i]=lcm(i,j);
}
}
}
spfa();
return 0;
}