标签:no 杯国赛 Max 短路 蓝桥 int que ll dis
思路
很明显的最短路,建完图后,直接跑dijkstra即可,细节见代码。
答案:10266837
Code
#include<iostream>
#include<queue>
#include<memory.h>
using namespace std;
typedef long long ll;
const int Max = 1e6 + 5;
int u[Max], v[Max], w[Max];
int g = 0, first[Max], nex[Max];
struct node
{
int n, w;
bool operator<(const node& a)const
{
return w > a.w;
}
node(int a, int b)
{
n = a;
w = b;
}
};
ll dis[Max], b[Max];
priority_queue<node> que;
void add(int a, int b,int c)
{
u[++g] = a;
v[g] = b;
w[g] = c;
nex[g] = first[a];
first[a] = g;
}
ll gcd(ll a, ll b)
{
if (a == 0)return b;
return gcd(b%a, a);
}
ll lcm(ll a, ll b)
{
return a * b / gcd(a, b);
}
int main()
{
memset(first, -1, sizeof(first));
memset(dis, 0x7f, sizeof(dis));
for (int i = 1;i <= 2021;i++)
{
for (int j = i + 1;j - i <= 21 && j <= 2021;j++)
{
add(i, j, lcm(i, j));
add(j, i, lcm(i, j));
}
}
que.push(node(1,0));
dis[1] = 0;
while(!que.empty())
{
node no = que.top();
que.pop();
if (b[no.n])continue;
dis[no.n] = no.w;
b[no.n] = 1;
for (int i = first[no.n];i != -1;i = nex[i])
{
if (b[v[i]])continue;
if (dis[u[i]] + w[i] < dis[v[i]])
{
dis[v[i]] = dis[u[i]] + w[i];
que.push(node(v[i],dis[u[i]]+w[i]));
}
}
}
cout << dis[2021];
}
标签:no,杯国赛,Max,短路,蓝桥,int,que,ll,dis 来源: https://blog.csdn.net/asbbv/article/details/117537096
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。