码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 53. 寻宝(第七期模拟笔试)(最小生成树练习)


    本题链接:卡码网KamaCoder

    题目:

    样例:

    输入
    1. 7 11
    2. 1 2 1
    3. 1 3 1
    4. 1 5 2
    5. 2 6 1
    6. 2 4 2
    7. 2 3 2
    8. 3 4 1
    9. 4 5 1
    10. 5 6 2
    11. 5 7 1
    12. 6 7 1
    输出
    6

    思路:

            由题意,这里是需要遍历完全部的顶点,求遍历完全部点的花费最短距离。

    从题干‘每个顶点都要访问一遍’,我们就应该联想到最小生成树,最小生成树中,有朴素版Prim最小生成树算法,和并查集的优化版Kruskal算法,由于这里的数据范围较大,所以我们应该使用并查集的优化版Kruskal算法。

    代码详解如下:

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #define endl '\n'
    8. #define YES puts("YES")
    9. #define NO puts("NO")
    10. #define umap unordered_map
    11. #define All(x) x.begin(),x.end()
    12. #pragma GCC optimize(3,"Ofast","inline")
    13. #define IOS std::ios::sync_with_stdio(false),cin.tie(0), cout.tie(0)
    14. using namespace std;
    15. const int N = 2e6 + 10;
    16. int n,m,ans;
    17. // 定义结点之间和边权的关系结构体,并定义数组
    18. struct Edge
    19. {
    20. int a,b,w;
    21. // 定义排序规则,将边权最小的放在前面
    22. inline bool operator<(const Edge&t)const
    23. {
    24. return w < t.w;
    25. }
    26. }edge[N];
    27. umap<int,int>p; // 标记的结点集合
    28. // 集合查找根节点函数
    29. inline int Find(int &x)
    30. {
    31. int t = x;
    32. while(x != p[x]) x = p[x];
    33. p[t] = x; // 剪枝路径操作
    34. return x;
    35. }
    36. inline void Kruskal()
    37. {
    38. // 排序好最小边权,我们优先连接最小边权的结点
    39. sort(edge,edge + m);
    40. // 初始化各个结点的连接根节点为本身
    41. for(int i = 0;i <= n;++i) p[i] = i;
    42. // 遍历每一条边权关系
    43. for(int i = 0;i < m;++i)
    44. {
    45. // 获取存储关系的两个结点
    46. int a = edge[i].a;
    47. int b = edge[i].b;
    48. // 查找对应结点的根节点
    49. a = Find(a),b = Find(b);
    50. if(a != b)
    51. {
    52. // 如果这两个结点未连接,我们将它们连接起来
    53. p[a] = b;
    54. ans += edge[i].w; // 累加最小边权
    55. }
    56. }
    57. return ;
    58. }
    59. inline void solve()
    60. {
    61. // 输入各个信息
    62. cin >> n >> m;
    63. for(int i = 0;i < m;++i)
    64. {
    65. int a,b,w;
    66. cin >> a >> b >> w;
    67. // 存储记录好结点的边权关系
    68. edge[i] = {a,b,w};
    69. }
    70. // 开始克鲁斯卡尔算法
    71. Kruskal();
    72. // 输出答案
    73. cout << ans << endl;
    74. }
    75. int main()
    76. {
    77. // freopen("a.txt", "r", stdin);
    78. IOS;
    79. int _t = 1;
    80. // cin >> _t;
    81. while (_t--)
    82. {
    83. solve();
    84. }
    85. return 0;
    86. }

    最后提交:

  • 相关阅读:
    用HTML+CSS做一个漂亮简单的个人网页——动漫网页【火影忍者】1个页面
    王学岗Linux系统的使用和Linux命令
    黑马JVM总结(十一)
    @Transactional 竟也能解决分布式事务?
    【Linux网络】ssh服务与配置,实现安全的密钥对免密登录
    鲲鹏代码迁移工具介绍
    [JavaScript]_[中级]_[动态创建表单并提交到新页面_实现后台内容预览]
    Windows 0环和3环通信方式
    还担心接口乱糟糟?快来试试“斯瓦格”在线文档管理平台!
    python没有重复数字的两位数统计 青少年编程电子学会python编程等级考试二级真题解析2021年6月
  • 原文地址:https://blog.csdn.net/hacker_51/article/details/134092851
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号