第十二届蓝桥杯 试题E 路径

该博客主要探讨了两种解决最短路径问题的算法:Dijkstra算法(通过堆优化)和Floyd算法。首先,通过预处理构建图,然后分别用Dijkstra和Floyd算法计算从起点1到终点2021的最短距离。Dijkstra算法利用优先队列实现,Floyd算法则采用动态规划策略。最终,展示了两种算法在求解特定问题上的应用和效率差异。

两种解法:

djkstra(堆优化了)

floyd(比较慢要多跑一会不过比较好写)

#include<iostream>
#include<vector>
#include<algorithm>
#include<set>
#include<map>
#include<unordered_set>
#include<unordered_map>
#include<queue>
#include<deque> 
#include<cstring>
#include<cmath>
#define x first
#define y second 
using namespace std;
typedef pair<int,int> PII;
const int N = 2100; 

vector<vector<PII>> g(N);
long long dis[N];
long long f[N][N];
bool book[N];
 
int gcd(int a,int b){
	return b?gcd(b,a%b):a;
} 
 
void djkstra(){
	
	memset(f,0x3f,sizeof f);
	for(int i = 1; i <= 2021; i++)
		for(int j = 1; j <= 2021; j++)
			if(abs(i-j) <= 21){
				int d = i*j/gcd(i,j);
				g[i].push_back({j,d});
				g[j].push_back({i,d});
			}
	
	memset(dis,0x3f,sizeof dis);
	dis[1] = 0;
	priority_queue<PII,vector<PII>,greater<PII>> que;
	que.push({dis[1],1});
	int ans = 0;
	while(que.size()){
		auto tmp = que.top();
		que.pop();
		if(book[tmp.y]) continue;
		book[tmp.y] = true;
		for(auto node:g[tmp.y]){
			if(book[node.x]) continue;
			if(dis[node.x] > dis[tmp.y] + node.y){
				dis[node.x] = dis[tmp.y] + node.y;
				que.push({dis[node.x],node.x}); 
			}
		}
	}
	
	cout<<dis[2021];
	
} 
 
void floyd(){
	
	memset(f,0x3f,sizeof f);
	for(int i = 1; i <= 2021; i++)
		for(int j = 1; j <= 2021; j++)
			if(abs(i-j) <= 21){
				int d = i*j/gcd(i,j);
				f[i][j] = f[j][i] = d; 
			}
	
	for(int k = 1; k <= 2021; k++){
		for(int i = 1; i <= 2021; i++)
			for(int j = 1; j <= 2021; j++){
				if(f[i][j] > f[i][k] + f[k][j]) {
					f[i][j] = f[i][k] + f[k][j];
				}
			}
	}
	
	cout<<f[1][2021];
	
} 
 
int main(){
			
	djkstra();			
	
//	floyd(); 
	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值