【蓝桥杯】路径--DIG算法

题目描述:

注意:

解题需要的几个辅助参数,注意合理初始化

题解代码

//2012第十二届蓝桥杯A组D题路径 
#include <bits/stdc++.h>
using namespace std;
const int maxx = 2050;
#define inf 0x3f3f3f3f   //十进制为1061109567,int 取值范围--2147483648 ~2147483647
int val[maxx][maxx];   //用来存放边与边对的权值 
bool visited[maxx];  //用来标记某点是否已经加入了最短路径,有效结点就是1-2021 
int dist[maxx];    //用来存放源点到各个节点的最短路径
//计算两个数最小公倍数
int minn(int x,int y)
{
	int mi = max(x,y);   //最小公倍数一定大于等于大的数值
	int ma = min(x,y); 
	if(mi % ma == 0)
		return mi;
	else
	{
		for(int m=mi;;m+=mi){
			if(m%ma==0)
				return m;
		}	
	} 
} 
//正式开始最短路径算法
void Dig(int st,int ed)
{
	//更新源点到各个节点的最短路径
	for(int i=1;i<=2021;++i){
		dist[i] = val[st][i];   
	}
	visited[st] = true;   //表示这个结点被访问过了
	dist[st] = 0;
	int num=1;   //记录已经有几个结点加入了1
	while(num<2021)
	{
		int minnnn = inf;
		int te_pos = -1;
		//寻找未加入最短路径的节点的最短路径?
		for(int i=1;i<=2021;++i){
			if(visited[i]==false && dist[i]<minnnn){
				minnnn = dist[i];
				te_pos = i;
			}
		}   //已经找到了一个最短路径的节点 
		visited[te_pos] = true;
		//看情况是否更新源点到各个节点的最短数据
		for(int i=1;i<=2021;++i){
			if(visited[i]==false && dist[i]>(dist[te_pos]+val[te_pos][i])){
				//更新节点
				dist[i] = dist[te_pos]+val[te_pos][i];
			}
		} 
		num++;
	}
	cout<<dist[ed]<<endl;
	
} 
int main(){
	memset(val,inf,sizeof(val));
	memset(visited,0,sizeof(visited));   //表示都没有经历过 
	//构建矩阵
	for(int i=1;i<=2021;++i){
		for(int j=1;j<=2021;++j){
			if(i==j) continue;    //自己到自己的路径也为inf最大 
			else if(abs(i - j) <= 21) val[i][j]=val[j][i]=minn(i,j); 
		}
	}
	//开始dig算法实现了
	int startt = 1;
	int endd = 2021;
	Dig(startt,endd); 
	return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hskwcy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值