• 蓝桥杯每日一题2023.10.1


     路径 - 蓝桥云课 (lanqiao.cn)

    题目分析 

    求最短路问题,有多种解法,下面介绍两种蓝桥杯最常用到的两种解法

    方法一

    Floyd(求任意两点之间的最短路)注:不能有负权回路

    初始化每个点到每个点的距离都为0x3f这样才能对比求出最短路

    由题意先将ab差的绝对值小于等于21的边的边权赋予,还有自己到自己的边为0

    1. #include
    2. using namespace std;
    3. typedef long long ll;
    4. const int N = 3000;
    5. int ans = 0x3f;
    6. int d[N][N];
    7. int gcd(int a, int b)
    8. {
    9. return b == 0 ? a : gcd(b, a % b);
    10. }
    11. int lcm(int a, int b)
    12. {
    13. return a * b / gcd(a, b);
    14. }
    15. int main()
    16. {
    17. memset(d, 0x3f, sizeof d);
    18. for(int i = 1; i <= 2021; i ++)
    19. {
    20. for(int j = 1; j <= 2021; j ++)
    21. {
    22. if(abs(i - j) <= 21)
    23. {
    24. d[i][j] = min(d[i][j], lcm(i, j));
    25. }
    26. }
    27. }
    28. for(int i = 1; i <= 2021; i ++)d[i][i] = 0;
    29. for(int k = 1; k <= 2021; k ++)
    30. {
    31. for(int i = 1; i <= 2021; i ++)
    32. {
    33. for(int j = 1; j <= 2021; j ++)
    34. {
    35. d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
    36. }
    37. }
    38. }
    39. cout << d[1][2021];
    40. return 0;
    41. }

    答案:10266837

    方法二

    Dijkstra(任意一点到所有点的最短路)

    第一步:初始化距离 dist[1] = 0, dist[i] = +∞

    第二步:找到当前没有确定点的最小值,找到最小的点之后用这个点去更新它到所有点的距离

     

    1. #include
    2. using namespace std;
    3. typedef long long ll;
    4. typedef pair<int, int> PII;
    5. const int N = 2e5 + 10;
    6. int e[N], ne[N], w[N], h[N], idx, d[N];
    7. bool st[N];
    8. int gcd(int a, int b)
    9. {
    10. return b == 0 ? a : gcd(b, a % b);
    11. }
    12. int lcm(int a, int b)
    13. {
    14. return a * b / gcd(a, b);
    15. }
    16. void add(int a, int b, int c)
    17. {
    18. e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++;
    19. }
    20. int dijkstra()
    21. {
    22. memset(d, 0x3f, sizeof d);
    23. d[1] = 0;
    24. priority_queue, greater> q;
    25. q.push({0, 1});
    26. while(q.size())
    27. {
    28. auto t = q.top();
    29. q.pop();
    30. int num = t.second, dis = t.first;
    31. if(st[num])continue;
    32. st[num] = true;
    33. for(int i = h[num]; i != -1; i = ne[i])
    34. {
    35. int j = e[i];
    36. if(d[j] > dis + w[i])
    37. {
    38. d[j] = dis + w[i];
    39. q.push({d[j], j});
    40. }
    41. }
    42. }
    43. //if(d[2021] == 0x3f3f3f3f)return -1;
    44. return d[2021];
    45. }
    46. int main()
    47. {
    48. memset(h, -1, sizeof h);
    49. for(int i = 1; i <= 2021; i ++)
    50. {
    51. for(int j = 1; j <= 2021; j ++)
    52. {
    53. if(abs(i - j) <= 21)
    54. {
    55. add(i, j, lcm(i, j));
    56. }
    57. }
    58. }
    59. cout << dijkstra();
    60. return 0;
    61. }
  • 相关阅读:
    【kubernetes】kubernetes中的Controller
    多线程(基础)
    从车窗升降一探 Android 车机的重要 API:车辆属性 CarProperty
    perl:BigInt 计算 斐波那契数列
    Java I/O(3):NIO中的Buffer
    河北工业大学计算机考研资料汇总
    【Seata】04 - Seata TCC 模式 Demo 调用流程分析
    一个支持IPFS的电子邮件——SKIFF
    Java基础之《netty(1)—netty介绍》
    centos系统中neo4j数据库和python环境部署
  • 原文地址:https://blog.csdn.net/m0_75087931/article/details/133468357