题目描述:
注意:
解题需要的几个辅助参数,注意合理初始化
题解代码
//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;
}