试题D 路径

题目链接:精选项目课程_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;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值