路径 自己的写法
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <iostream>
using namespace std;
const int N = 2200;
int g[N][N];
int dist[N]; // 从源点到各点的距离
int book[N]; // 标记是否找到最短的
int n = 2021;
int inf = 0x3f3f3f3f;
int gcd(int a, int b)
{
return b ? gcd(b, a % b) : a;
}
int lcm(int a, int b)
{
return a * b / gcd(a,b);
}
void dijkstra(int s, int d)
{
for (int i = 1; i <= n; i ++ )
{
dist[i] = g[s][i];
}
dist[s] = 0;
book[s] = 1;
int minn;
int u = 0, v;
for (int i = 2; i <= n; i ++ )
{
minn = inf;
// 寻找所有没有找到最短路径的点
for (int j = 1; j <= n; j ++ )
{
if(!book[j] && minn > dist[j])
{
minn = dist[j];
u = j; // 记录下这个点
}
}
book[u] = 1; // 通过u点 松弛
for (v = 1; v <= n; v ++ )
{
if (g[u][v] < inf && !book[v])
{
if(dist[v] > dist[u] + g[u][v])
{
dist[v] = dist[u] + g[u][v];
}
}
}
}
cout << dist[d] << endl;
}
int main()
{
for (int i = 1; i <= n; i ++ )
{
for (int j = 1; j <= n; j ++ )
{
if (i != j)
{
if (fabs(i - j) <= 21)
{
g[i][j] = lcm(i, j);
g[j][i] = lcm(i, j);
}
else
{
g[i][j] = inf;
g[j][i] = inf;
}
}
}
}
dijkstra(1, 2021);
return 0;
}