迪杰斯特拉算法
#include<iostream>
#include<algorithm>
#include<math.h>
#include<vector>
using namespace std;
const int N = 2201;
int g[N][N];
int dist[N];
bool vis[N];
int n = 2021;
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);
}
int dijkstra()
{
for (int i = 1; i <= 2021; i++) {
dist[i] = 0x3f3f3f3f;
}
dist[1] = 0;
for (int i = 1; i <= n; i++)
{
int minx = 0x3f3f3f3f;
int minmark;
for (int j = 1; j <= n; j++)
{
if (vis[j] == false && dist[j] <= minx)
{
minx = dist[j];
minmark = j;
}
}
vis[minmark] = true;
for (int j = 1; j <= n; j++)
{
if (vis[j] == false && dist[j] > dist[minmark] + g[minmark][j])
{
dist[j] = dist[minmark] + g[minmark][j];
}
}
}
return dist[n];
}
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] = 0x3f3f3f3f;
g[j][i] = 0x3f3f3f3f;
}
}
}
}
cout << dijkstra();
return 0;
}