问题描述
格式输入
无
格式输出
最短路径长度
评测用例规模与约定
无
解析
看到最短路径想到使用最短路算法不了解最短路算法请看最短路算法
然后本题的题意是节点编号差值大于21就没有边相连,小于等于21就用两个节点编号a,b的最小公倍数lcm(a,b)长度的边相连,然后求1号节点到2021号节点的最短距离。用最短路算法可以做到。我们就先用floyd算法做比较慢,不过填空题这样可以做,还有别的更快的最短路算法大家可以试试在学习之后。
参考程序
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define MAXN 1e18
ll dp[2025][2025];
int n = 2021;
void floyd(){
for(int k = 1; k <= n; k++)
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
dp[i][j] = min(dp[i][j] , dp[i][k] + dp[k][j]);
}
int main()
{
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
if(i == j) dp[i][j] = 0;
else if(abs(i - j) <= 21) dp[i][j] = dp[j][i] = i * j / __gcd(i, j);
else dp[i][j] = dp[j][i] = MAXN;
}
}
cout <<dp[1][2021];
return 0;
}
难度等级
⭐️⭐️⭐️学习最短路算法后很容易做出来。(1~10星)
以个人刷题整理为目的,如若侵权,请联系删除~