#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 2200, M = N * 50;
int n;
int h[N],e[M],w[M],ne[M],idx;//带权单链表
int q[M] , d[M];//队列,d[]存储距离
bool st[M];
void add(int a , int b , int c)//边权是c
{
e[idx] = b , w[idx] = c , ne[idx] = h[a] , h[a] = idx++;
}
//绝对值
int fabs(int x)
{
if(x < 0) return -x;
else return x;
}
//最小公约数
int ges(int a , int b)
{
while(a!=b)
{
if(a>b) a = a - b;
else b = b - a;
}
return a;
}
int spfa() // 求1号点到n号点的最短路距离
{
int hh = 0, tt = 0;
memset(d, 0x3f, sizeof d);
d[1] = 0;
q[tt ++ ] = 1;
st[1] = true;
while (hh != tt)
{
int t = q[hh ++ ];
if (hh == N) hh = 0;
st[t] = false;
for (int i = h[t]; i != -1; i = ne[i])
{
int j = e[i];
if (d[j] > d[t] + w[i])
{
d[j] = d[t] + w[i];
if (!st[j]) // 如果队列中已存在j,则不需要将j重复插入
{
q[tt ++ ] = j;
if (tt == N) tt = 0;
st[j] = true;
}
}
}
}
return d[n];
}
int main()
{
n = 2021;
memset(h , -1 , sizeof h);
for(int i = 1 ; i <= n ; i++)
for(int j = 1; j <= n ; j++)
{
if(fabs(i-j) <= 21)
{
int p = ges(i ,j);//最小公约数
add(i , j , i * j / p);
}
}
//求1号点到n号点的最短路距离
cout << spfa();
}
现在,她一个人漫游在夜晚的黄原街头,细细思索着孙少平这个人和他的道路。她从他的谈吐中,知道这已经是一个对生活有了独特理解的人。
——《平凡的世界》第二十三章
常常将自己化身为少平,却唯独少了那份坚定