题目链接:精选项目课程_IT热门课程_蓝桥云课课程 - 蓝桥云课
题目答案:1026637
题目解析:最短路算法考查(此处采用Dijkstra算法)
代码:
//#define local
#include<cstdio>
#include<iostream>
#include<vector>
#include<queue>
#include<cmath>
#define INF 0x3f3f3f3f
#define MAXN 2022
typedef long long ll;
using namespace std;
struct node{
int bh;
ll dis;
node(int bh,ll dis):bh(bh),dis(dis){
}
bool operator < (const node &t) const {
if(dis!=t.dis)
return t.dis<dis;
else
return t.bh<bh;
}
};
int e[MAXN][MAXN];
ll dis[MAXN];
int vis[MAXN]={0};
priority_queue<node>q;
int gcd(int a,int b){
return b==0?a:gcd(b,a%b);
}
int lcm(int a,int b){
return a*b/gcd(a,b);
}
int main(){
#ifdef local
freopen("data.in","rb",stdin);
//freopen("data.out","wb",stdout);
#endif
fill(e[0],e[0]+MAXN*MAXN,INF);
fill(dis,dis+MAXN,INF);
dis[1]=0;
vis[1]=1;
q.push(node(1,0));
for(int i=1;i<MAXN;++i){
for(int j=i;j<=i+21&&j<MAXN;++j){
e[i][j]=e[j][i]=lcm(i,j);
}
}
while(!q.empty()){
node tmp=q.top();
q.pop();
int now=tmp.bh;
vis[now]=1;
for(int i=max(now-21,1);i<=now+21&&i<MAXN;++i){
if(vis[i])
continue;
if(dis[i]>dis[now]+e[now][i]){
dis[i]=dis[now]+e[now][i];
q.push(node(i,dis[i]));
}
}
}
cout<<dis[MAXN-1];
return 0;
}