2021年蓝桥杯C/C++B组试题E路径(dij+前向星+堆优化+lcm)

 

题解:

   比赛时做这个题目的时候心态已经被C,D两题搞炸了,做的时候手忙脚乱,本下想写迪杰斯特拉的,结果写着写着就写成spfa了,辛亏是个填空题,不然又得炸,废话少说,上代码

#include<bits/stdc++.h>

using namespace std;
struct EDGE
{
	long long l,t,next;
	
}edge[100003];
struct node 
{
	long long l,t;
	bool operator<(const node &a)const 
	{
		return l>a.l;	//注意这里的运算符重载 
	}
};
long long head[100003];
long long vis[2023];
long long dis[2023];
long long pos=0;
void add(long long x,long long y,long long z)
{
	edge[++pos].l=z;
	edge[pos].t=y;
	edge[pos].next=head[x];
	head[x]=pos;
}
long long gcd(long long a,long long b)
{
return a%b==0?b:gcd(b,a%b);
}
long long dij(long long s,long long t)
{
	priority_queue<node>q;
	memset(vis,0,sizeof(vis));
	memset(dis,0x3f,sizeof(dis));
	node u;
	u.l=0;
	u.t=s;
	q.push(u);
	dis[s]=0;
	while(!q.empty())
	{
		node v=q.top();
		q.pop();
		if(vis[v.t]==1)continue;
		vis[v.t]=1;
		for(long long i=head[v.t];i!=-1;i=edge[i].next)
		{
			long long y=edge[i].t;
			long long len=edge[i].l;
			if(dis[y]>dis[v.t]+len)
			{
				dis[y]=dis[v.t]+len;
				node  t1;
				t1.l=dis[y];
				t1.t=y;
				q.push(t1);
			}
		}
	}
	return dis[t];
}
int main()
{
	memset(head,-1,sizeof(head));	//这里不初始化会炸 
	memset(edge,-1,sizeof(edge));	
	for(long long i=1;i<=2021;i++)
		for(long long j=i+1;j<=2021;j++)
		{
			if(i!=j&&abs(i-j)<=21)
			{
				long long len=gcd(i,j);
				len=i*j/len;	//lcm(i,j)*gcd(i,j)==i*j 
				add(i,j,len);
			}
		}
	cout <<dij(1,2021)<<endl;
	return 0;
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值