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

扫地机器人(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.lryc.cn/news/623383.html

相关文章:

  • 【P14 3-6 】OpenCV Python——视频加载、摄像头调用、视频基本信息获取(宽、高、帧率、总帧数),视频保存在指定位置
  • LeetCode 刷题【43. 字符串相乘】
  • 安卓11 12系统修改定制化_____修改运营商版本安装特定应用时的默认规则
  • 美国服务器环境下Windows容器工作负载基于指标的自动扩缩
  • 基于 LoRA的广义知识蒸馏(GKD)训练
  • 【总结型】c语言中的位运算
  • Java -- 泛型-自定义泛型
  • 在职老D渗透日记day18:sqli-labs靶场通关(第26关)get报错注入 过滤or和and基础上又过滤了空格和注释符 ‘闭合 手动注入
  • Qt 动态属性(Dynamic Property)详解
  • 牛 CDR3 单抗:抗病毒领域的 “纳米级精准导弹”
  • 系统思考—啤酒游戏经营决策沙盘认证
  • 第二十五天:构造函数/析构函数/拷贝构造
  • SpringBoot 整合 Langchain4j:系统提示词与用户提示词实战详解
  • 小白学习《PCI Express体系结构导读》——第Ⅰ篇第1章PCI总线的基本知识
  • 《A Practical Guide to Building Agents》文档学习
  • Nginx蜘蛛请求智能分流:精准识别爬虫并转发SEO渲染服务
  • 23. CommonJS 和 ES6 Module 区别
  • 第6问 数据分析领域主要的岗位有哪些?
  • autofit.js: 自动调整HTML元素大小的JavaScript库
  • Java设计模式详细解读
  • 安卓四大组件基础题
  • AI搜索:大模型商业落地的“第一束光”,照见了什么?
  • 【数据结构】深入理解单链表与通讯录项目实现
  • aws(学习笔记第五十一课) ECS集中练习(3)
  • MySQL锁机制:悲观锁VS乐观锁详解
  • 初识c语言————宏定义和调用
  • C语言零基础第18讲:自定义类型—结构体
  • 新手向:GitCode疑难问题诊疗
  • C语言:文件操作详解
  • 从 MySQL 5.7 迁移到 8.0:别让 SQL 文件 “坑” 了你