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

扫地机器人(2025蓝桥杯省A组 H题)

题目:蓝桥杯2025年第十六届省赛真题-扫地机器人 - C语言网

用到算法:基环树,拓扑排序,单调队列,前缀和

参考讲解/思路详解:蓝桥杯真题 - 扫地机器人_哔哩哔哩_bilibili

P12145 [蓝桥杯 2025 省 A] 扫地机器人 - 洛谷

code

#include <bits/stdc++.h>
using namespace std;int main()
{// inputint n;cin>>n;vector<int> w(n + 1, 0), d(n + 1, 0), vis(n + 1, false);vector<vector<int>> g(n + 1, vector<int>());for(int i = 0; i < n; i++){cin>>w[i];}for(int i = 0; i < n; i++){int u, v; cin>>u>>v;u--; v--;// 保证下标一致g[u].push_back(v);g[v].push_back(u);d[u]++; d[v]++;}// 拓扑排序,标记非环上节点queue<int> q;for(int i = 0; i < n; i++){if(d[i] == 1){vis[i] = true;q.push(i);}}while(q.size()){int pnt = q.front();q.pop();for(auto son:g[pnt]){if(--d[son] == 1) {q.push(son);vis[son] = true;}}}// 拆环, 环上每点当root跑环的直径int st = 0, cnt = 0;// st:环上任意一点,cnt:环的长度vector<int> f1(2 * n + 2, 0), f2(2 * n + 2, 0);int ans = 0;auto dfs = [&](auto dfs, int u, int fa)->void{f1[u] = w[u];f2[u] = w[u];for(int l : g[u]){if(l == fa || !vis[l]) continue;dfs(dfs, l, u);if(f1[l] + w[u] > f1[u]){f2[u] = f1[u];f1[u] = f1[l] + w[u];}else f2[u] = max(f2[u], f1[l] + w[u]);}ans = max(ans, f1[u] + f2[u] - w[u]);// 第一种情况,最长路径不过环};for(int i = 0; i < n; i++){if(vis[i]) continue;cnt++;st = i;dfs(dfs, i, -1);}vector<int> dist(2 * cnt + 2, 0), dp1(2 * cnt + 2, 0), dp2(2 * cnt + 2, 0);int idx = 0;auto dfs1 = [&](auto dfs1, int u, int fa)->void{dp1[++idx] = f1[u] - w[u];dp2[idx] = f2[u] - w[u];dist[idx] = w[u];vis[u] = true;// 防止无线循环for(int l : g[u]){if(l == fa || vis[l]) continue;dfs1(dfs1, l, u);}};dfs1(dfs1, st, -1);// 破链成环for(int i = 1; i <= cnt; i++){dp1[i + cnt] = dp1[i];dp2[i + cnt] = dp2[i];dist[i + cnt] = dist[i];}for(int i = 1; i <= 2 * cnt; i++){dist[i] = dist[i] + dist[i -1];}// 特判环上点权之和加上某一棵子树根的最长链加次长链。for(int i = 1; i <= cnt; i++){ans = max(ans, dist[cnt] + dp1[i] + dp2[i]);}// 常规情况,外部进环,绕环半圈后出环deque<pair<int, int>> dq;// 单调队列,维护dp1[i] - dist[i-1]的最值for(int j = 1; j <= 2 * cnt; j++)// 以j结尾的最长路径{while(dq.size() && j - dq.front().first + 1 > cnt) dq.pop_front();if(dq.size()) ans = max(ans, dist[j] + dp1[j] + dq.front().second);// 细节,在将j入dp前更新answhile(dq.size() && dq.back().second < dp1[j] - dist[j - 1]) dq.pop_back();dq.push_back({j, dp1[j] - dist[j - 1]});}cout<<ans<<endl;return 0;
}

http://www.xdnf.cn/news/18107.html

相关文章:

  • AI重构文化基因:从“工具革命”到“生态觉醒”的裂变之路
  • 线性代数之两个宇宙文明关于距离的对话
  • 完整的VOC格式数据增强脚本
  • 狗品种识别数据集:1k+图像,6个类别,yolo标注完整
  • .net印刷线路板进销存PCB材料ERP财务软件库存贸易生产企业管理系统
  • 曲面/线 拟合gnuplot
  • 第四章:大模型(LLM)】06.langchain原理-(5)LangChain Prompt 用法
  • 第七十五章:AI的“思维操控师”:Prompt变动对潜在空间(Latent Space)的影响可视化——看懂AI的“微言大义”!
  • P2169 正则表达式
  • LeetCode 刷题【43. 字符串相乘】
  • 视觉语言模型(VLA)分类方法体系
  • Kotlin-基础语法练习一
  • 代码随想录算法训练营四十三天|图论part01
  • Ubuntu 25.04 安装并使用 MySQL 8.4.5 的步骤
  • MySQL完整重置密码流程(针对 macOS)
  • AI应用安全 - Prompt注入攻击
  • 深入解析Java代理模式:灵活控制对象访问的核心技术
  • 配置国内加速源后仍然无法拉取镜像
  • STC8单片机驱动I2C屏幕:实现时间、日期与温湿度显示
  • Rust 中 i32 与 *i32 的深度解析
  • 解决zabbix图片中文乱码
  • 46.Sentinel规则持久化
  • 8位量化简介(40)
  • 铨林接纸机学习记录1
  • ramdisk内存虚拟盘(一)——前世今生
  • 按键序列常用示例
  • Mini MAX AI应用矩阵测评报告——基于旗下多款产品的综合体验与行业价值分析
  • 六大主流负载均衡算法
  • 分享一个基于Hadoop的二手房销售签约数据分析与可视化系统,基于Python可视化的二手房销售数据分析平台
  • Oracle按照特定列值排序和C#统计特定列值的所有行