蓝桥杯路径

#include<iostream> #include<queue> #include<cstring> using namespace std; const int maxn = 10000005; int gcd(int a, int b) { if (b == 0)return a; else return gcd(b, a % b); } int lcm(int a, int b) { int u = a * b; return u / gcd(a, b); } struct node { int to, next, w; }edge[maxn]; int head[maxn]; int cnt = 0; void addedge(int a, int b, int c) { edge[++cnt].to = b; edge[cnt].next = head[a]; edge[cnt].w = c; head[a] = cnt; } struct dis { int bian, dist; bool operator<(const dis& b)const { return dist > b.dist; } }; priority_queue<dis> q; bool vis[maxn]; int D[maxn]; void djstl(int s) { memset(D, 0x3f3f3f3f, sizeof(D)); D[s] = 0; q.push({ s,0 }); while (!q.empty()) { int x = q.top().bian; int value = q.top().dist; q.pop(); if (vis[x])continue; vis[x] = true; for (int i = head[x]; i; i = edge[i].next) { int y = edge[i].to; if (!vis[y] && D[x] + edge[i].w < D[y]) { D[y] = D[x] + edge[i].w; q.push({ y,D[y] }); } } } } int main(void) { //for (int i = 1; i <= 2021; i++) //{ // int rec = i; // for (int j = -21; j <= 21; j++) // { // if (rec + j >= 1 && rec + j <= 2021 && rec + j != rec) // { // addedge(rec, rec + j, lcm(rec, rec + j)); // } // } //} for (int i = 1; i <= 2021; i++) { for (int j = 1; j <= 2021; j++) { if (abs(i - j) <= 21) { addedge(i, j, lcm(i, j)); } } } djstl(1); cout << D[2021]; return 0; }
计算机小白记录学习过程,喜欢就点个推荐和关注吧O(∩_∩)O哈哈~

浙公网安备 33010602011771号