// lanqiao 1460 路径(Dijkstra) #include using namespace std; const int N = 3e3 + 10, INF = INT_MAX; int g[N][N]; // 领接矩阵 bool vis[N]; // 标记数组 int mindis[N]; // 最短路数组 int s = 1, n = 2021; // 朴素版dijkstra-时间复杂度 O(n^2) void dijkstra(int s){ mindis[s] = 0; // 自己到自己的距离为0 for(int i = 1; i <= n; i++){ int mi = INF, cur = 0; for(int j = 1; j <= n; j++){ if(!vis[j] && mindis[j] < mi){ mi = mindis[j]; cur = j; } } vis[cur] = 1; // 已经确定起点到cur点的最短距离,所以要标记 // 以cur点作为中转点去更新起点到其他各点的距离 for(int i = 1; i <= n; i++){ if(!vis[i]&&g[cur][i] != 0){ if(mi + g[cur][i] < mindis[i]){ mindis[i] = mi + g[cur][i]; } } } } } int main(){ for(int i = 1; i <= n; i++){ for(int j = max(i-21, 1); j < min(i+21, 2021); j++){ if(i != j) g[i][j] = g[j][i] = lcm(i, j); } } fill(mindis, mindis + N, INF); dijkstra(s); cout << mindis[n] << endl; return 0; } // correct output 10266837