From 8a7724881974f95d8ec9a583a9a5c6449d9ddd35 Mon Sep 17 00:00:00 2001 From: xingyou wu <3050128610@qq.com> Date: Thu, 3 Apr 2025 08:55:09 +0800 Subject: [PATCH] =?UTF-8?q?lanqiao=201460=20=E8=B7=AF=E5=BE=84(Dijkstra)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 12lanqiao/test5-1.cpp | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 12lanqiao/test5-1.cpp diff --git a/12lanqiao/test5-1.cpp b/12lanqiao/test5-1.cpp new file mode 100644 index 0000000..fbe1cc1 --- /dev/null +++ b/12lanqiao/test5-1.cpp @@ -0,0 +1,43 @@ +// 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; + 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; +}