蓝桥杯路径

 

 

#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;
}

 

posted @ 2021-05-19 19:37  loliconsk  阅读(448)  评论(1)    收藏  举报