当前位置: 首页 > news >正文

算竞代码设计与技巧解析

本文使用了ai辅助,旨在更好的帮助大家理解一些技巧

邮递员送信_牛客题霸_牛客网

以这一题为例,需要对节点 1 求 两次 dijkstra,怎么使得代码写的简洁?
ac 代码如下,我们来一一解析:

void solve()
{int n(q_), m(q_);using ED = array<int, 2>;using GRAPH = vector<vector<ED>>;GRAPH tr(n + 1);GRAPH rtr(n + 1);ffp(i, 1, m){int u(q_), v(q_), w(q_);tr[u].push_back({ w,v });//tr是树边,本人的习惯rtr[v].push_back({ w,u });//rtr是反图}auto dij = [&](int st, GRAPH& gp)->ll{priority_queue<ED, vector<ED>, greater<ED>>dui;vector<int>dis(n + 1, iINF); dis[st] = 0;dui.push({ 0,st });while (dui.size()){auto [w, now] = dui.top();dui.pop();if (dis[now] < w)continue;for (auto [nxtw, nxt] : gp[now]){if (nxtw + dis[now] >= dis[nxt])continue;dis[nxt] = nxtw + dis[now];dui.push({ nxtw + dis[now],nxt });}}return accumulate(dis.begin() + 1, dis.end(), 0ll);};cout << dij(1, tr) + dij(1, rtr) << endl;return;
}

【初始化与快读】 首先,我们使用 n(q_), m(q_) 对变量进行初始化。这里的 q_ 是封装好的快读对象(Fast I/O),用于高效读取整数。值得一提的是,n(q_) 使用的是直接初始化(Direct Initialization),而我们常见的 n = q_ 属于复制初始化(Copy Initialization)。虽然在基础类型上二者生成的汇编指令并无差异,但直接初始化更具 Modern C++ 的风格。

【类型别名优化】 为了提升代码的可读性与编写效率,我们使用 using ED = array<int, 2> 为边的存储结构定义别名,同理定义了 GRAPH。这样不仅减少了冗余代码,也便于后续维护。

【存图细节】 在读入边权并建图时,有一个关键细节:tr[u].push_back({ w, v })。请注意,我们将 权值 w 放在了 array 的首位。 这是为了配合后续的 priority_queue。由于 STL 的容器默认按字典序比较(即先比较第一个元素),将权值置于首位,可以直接利用默认的比较规则实现“按权值排序”,无需额外编写比较函数。

【Dijkstra 的封装】 我们使用 Lambda 表达式封装了 Dijkstra 算法。在传参时,图结构 GRAPH 必须使用引用传递(建议为 const 引用),以避免在函数调用时发生巨大的内存拷贝开销,防止 TLE(超时)。

【累加器的陷阱】 计算最终结果时,我使用了 <numeric> 库中的 accumulate 函数。这里潜藏着一个常见的溢出陷阱accumulate 的第三个参数决定了累加过程的数据类型。 如果传入 0,编译器会将其推导为 int 类型进行累加,这在处理大数时会导致溢出。因此,必须显式传入 0ll(即 long long 类型的 0),以确保计算过程使用长整型。

【I/O 细节】 最后,输出时使用 \n 替代 endlendl 会强制刷新缓冲区,在大规模输出场景下可能导致显著的性能损耗。

http://www.jsqmd.com/news/288894/

相关文章:

  • TCP三次握手与四次挥手:两个“社恐”程序的破冰与告别仪式
  • vue3基于python的流浪猫爱心救助系统
  • PPT内容粘贴到CKEDITOR为何动画失效?
  • 金融保险行业网页,JAVA如何处理多附件的分块上传功能?
  • 小程序python实验室预约排课系统
  • 2026年市面上热门的升降机生产厂家联系电话,自行走升降平台/液压升降平台/移动登车桥,升降机生产厂家联系方式
  • python智能水务巡检预警应急调度与决策系统的设计与实现
  • 归一化说明
  • 小程序python康养旅游服务系统 计划管理APP 功能多
  • 2026 年 1 月条码设备与耗材厂家推荐排行榜:条码打印机/扫描枪/标签/碳带/序列化/追溯系统,专业高效条码解决方案源头厂家精选
  • 【实战项目】 大语言模型轻量化后的下游任务适配性分析
  • FONE受邀加入华东人工智能应用联盟,获评“首届人工智能应用最佳伙伴”
  • 大数据基于Python的电商用户消费行为分析
  • 前端处理Excel:从导入导出到数据处理全攻略
  • 《优雅应对失败:JavaScript异步重试模式详解》
  • 交易·社交·管理一体化,开源可商用的二手平台小程序源码系统
  • 基于PLC的室内温度控制系统设计(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码
  • Docker run 命令详解(-a、-d、-e、-h、-i、-m、-p、-t、-v、--cpuset、--dns、--env-file、--expose、--link、--name、--net)
  • 全网最全9个AI论文平台,专科生轻松搞定论文写作!
  • 2026必备!专科生毕业论文AI论文工具TOP8测评
  • 哈希表电话号码管理系统(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码
  • 把PP-OCRv5_server模型转换为OpenVINO格式
  • 基于Docker部署M3U8流媒体
  • 国外的文献资料在哪里查?实用查询途径与方法指南
  • 华为光学工程师面试题
  • AI媒体助理软件批量文章生成设置教程
  • 【实战项目】 基于BP神经网络的情感机器人玩具的设计与实现
  • 机械制造领域网页,JAVA如何实现大文件的分块与秒传?
  • 2026铝镁锰/铝镁锰板/铝镁锰合金屋面/金属屋面板厂家推荐,专业施工品质保障!
  • 国外期刊论文搜索网站使用指南:高效查找学术资源的实用平台