UESTC 23-th ACM-ICPC 初赛 Q. 校车

news/2025/4/2 6:01:36/文章来源:https://www.cnblogs.com/YipChipqwq/p/18802064

image

这东西其实蛮像最小斯坦纳树,不过我们通过状压DP的思想来讲一讲这个题。

形式化题意:考虑一共有 \(n\) 个点,\(m\) 条无向边,你需要从图中选出至多 \(K\) 条闭合路径,使得所有 \(w\) 个关键点都被覆盖,使得最长路径最小。

容易发现 \(n \le 500\),因此我们可以通过 Floyd 跑出所有点对 \(u, \, v\) 之间的最短路径长度 \(dist(u, \, v)\),我们发现,有用的点的个数只有 \(w\) 个,因此我们存下所有的 \(p_i\) 之后,只有 \(dist(p_i, \, p_j)\) 才是有价值的,因此我们的状态数不会太多。

接下来我们考虑怎么选出一条闭合路径,设 \(d[i][S]\) 表示从 \(1\) 开始,不重复的走到第 \(i\) 个关键点,经过关键点的集合为 \(S\) 的最短路径长度,容易得到

\[d[k][S \cup p_k] = \min\limits_{p_i \in S}\{d[i][S \cup p_k] + dist(p_i, \, p_k)\} \]

我们枚举点的顺序决定了我们的 \(d\) 的值一定是一条路径,而不是一颗树。

然后我们考虑 \(ring[S]\) 表示经过集合 \(S\) 中所有关键点的最短闭合路径长度,它的转移也是直观的

\[ring[S] = \min\limits_{p_i \in S}\{d[i][S] + dist(1, \, p_i)\} \]

如此,我们把所有的闭合路径处理出来后,我们就可以进行我们答案的转移了。

我们定义 \(dp[i][S]\) 表示我们选择了 \(i\) 条闭合路径,覆盖的关键点集为 \(S\) 的最长路径的最小值,那么有

\[dp[i][S] = \min\limits_{T \subseteq S}\{\max\{dp[i - 1][T], \, ring[S / T]\}\} \]

设所有关键点的集合总和是 \(P\),于是我们的答案可以表示为

\[ans = \min\limits_{1 \le i \le k}\{dp[i][P]\} \]

Floyd 跑闭包复杂度是 \(O(n^3)\),最短路径长度更新是 \(O(w^22^w)\),选一条闭合路径的复杂度是 \(O(w2^w)\),子集枚举动规的复杂度是 \(O(k3^w)\),极限数据下,\(k\)\(w\) 同阶,于是总时间复杂度为 \(O(n^3 + (w + w^2)2^w + w3^w)\),计算可得 \(500^3 + (14 + 14^2) \times 2^{14} + 14 \times 3^{14} = 195402206\),最慢的一步是 Floyd 闭包,可以通过。

参考代码

#include<bits/stdc++.h>
using namespace std;
const int N = 510, M = 16, B = 1 << 16;
int n, m, K, W;
int p[N];
int e[N][N], dis[M][B], ring[B], dp[M][B];void solve() {cin >> n >> m >> W >> K;memset(e, 0x3f, sizeof e);for (int i = 1; i <= n; i ++ ) e[i][i] = 0;for (int i = 1; i <= m; i ++ ) {int a, b, c;cin >> a >> b >> c;e[a][b] = e[b][a] = c;}for (int k = 1; k <= n; k ++ ) {for (int i = 1; i <= n; i ++ ) {for (int j = 1; j <= n; j ++ ) {e[i][j] = min(e[i][j], e[i][k] + e[k][j]);}}}memset(dis, 0x3f, sizeof dis);memset(ring, 0x3f, sizeof ring);memset(dp, 0x3f, sizeof dp);for (int i = 0; i < W; i ++ ) {cin >> p[i];dis[i][1 << i] = e[1][p[i]];}for (int i = 0; i < W; i ++ ) {for (int j = 0; j < W; j ++ ) {for (int k = 0; k < 1 << W; k ++ ) {if (!(k >> i & 1)) continue;if (k >> j & 1) continue;dis[j][k ^ (1 << j)] = min(dis[j][k ^ (1 << j)], dis[i][k] + e[p[i]][p[j]]);}}}ring[0] = 0;for (int i = 0; i < W; i ++ ) {for (int j = 1; j < 1 << W; j ++ ) {if (j >> i & 1) {ring[j] = min(ring[j], dis[i][j] + e[1][p[i]]);}}}for (int i = 0; i < 1 << W; i ++ ) dp[1][i] = ring[i];for (int S = 1; S < 1 << W; S ++ ) {for (int i = 2; i <= K; i ++ ) {for (int T = S & (S - 1); T; T = (T - 1) & S) {dp[i][S] = min(dp[i][S], max(dp[i - 1][T], ring[S ^ T]));}}}int ans = 1e9;for (int i = 1; i <= K; i ++ ) ans = min(ans, dp[i][(1 << W) - 1]);cout << ans << "\n";
}int main() {ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int T = 1;// cin >> T;while (T -- ) solve();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/908626.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

360度全景环视(AVM Around View Monitor)简介

AVM(Around View Monitor),中文:全景环视系统。 在自动驾驶领域,AVM属于自动泊车系统的一部分,是一种实用性极高、可大幅提升用户体验和驾驶安全性的功能。利用车身四周摄像头,拼接出以车身为中心的360环视画面,直接鸟瞰车身周边情况。支持多种车型,具有4路、6路、或前…

htb Code

先快速扫描 rustscan -a 10.10.11.62PORT STATE SERVICE REASON 22/tcp open ssh syn-ack ttl 63 5000/tcp open upnp syn-ack ttl 63 发现有一个5000端口 nmap扫描 nmap -sC -sV -p 5000 -v -Pn -T4 10.10.11.62发现是一个python的命令执行的环境 接下来进行沙…

敏捷开发的终极形态?2025年必试的5款集成混沌工程的项目管理黑科技

随着企业数字化转型的加速,敏捷开发已从单纯的高效迭代演变为融合混沌工程的“韧性敏捷”模式。混沌工程通过主动注入系统故障,验证系统在异常条件下的稳定性,成为保障敏捷开发持续交付的关键技术。据Gartner预测,到2025年,70%的企业将在敏捷流程中集成混沌工程以增强系统…

SQL SERVER日常运维巡检系列之-实例级参数

前言做好日常巡检是数据库管理和维护的重要步骤,而且需要对每次巡检日期、结果进行登记,同时可能需要出一份巡检报告。本系列旨在解决一些常见的困扰: 不知道巡检哪些东西不知道怎么样便捷体检机器太多体检麻烦生成报告困难,无法直观呈现结果 实例的参数对系统性能和稳定…

How Memory is Implemented in LLM-based Agents?

原文链接:https://medium.com/@parklize/how-memory-is-implemented-in-llm-based-agents-f08e7b6662ff在之前的文章中,我们讨论了大语言模型(LLM)的局限性以及LLM与基于LLM的智能体之间的关系。 智能体为LLM带来的关键增强功能之一是记忆能力,这有助于克服LLM的上下文长度…

运行MBConicHulls教程

为了运行MBConicHulls(a Mathematica package to evaluate N-fold MB integrals)需要安装啥 目录环境Mathematica 13.0.1 Linux版 ✅MultivariateResidues.m (计算多变量余数)✅TOPCOM(一个用于计算三角剖分和相关结构的软件包) ✅前置安装需求步骤-已跑通安装完了测试一下…

信创概念股投资回报率最高的五家公司

信创产业作为近年来备受瞩目的领域,其发展态势对投资者具有极大的吸引力。探寻信创概念股中投资回报率最高的五家公司,对于投资者来说至关重要。这不仅能为他们的资金找到更具潜力的投向,也有助于把握行业发展的脉搏,在复杂多变的市场中获取丰厚的回报。随着信息技术的飞速…

信创国产化背景下人才培养的四大策略

信创国产化是当前我国科技发展的重要战略方向,旨在实现信息技术领域的自主可控,减少对国外技术的依赖,保障国家信息安全。在这一背景下,人才的培养显得尤为关键。信创国产化涉及众多领域和技术,从芯片、操作系统、数据库到各类应用软件,每一个环节都需要专业人才的支撑。…

信创行业政策支持与市场机遇探讨

信创,即信息技术应用创新产业,旨在实现信息技术领域的自主可控,保障国家信息安全。近年来,随着全球政治经济形势的变化以及科技竞争的日益激烈,信创行业迎来了前所未有的发展契机。政策的大力支持为信创行业筑牢了坚实的发展根基,而广阔的市场则为其提供了无限的增长可能…

华硕asus灵耀pro14笔记本电脑在使用自带oled屏幕时低亮度灰色背景时有肉眼可见的闪烁频闪现象

因为平时都是外接屏幕使用,没太在意,最近经常搬着笔记本到处用,才注意到 原本以为是硬件层面的问题,后来搜了一下发现可能是驱动级的节能设置导致的 打开“英特尔显卡控制中心”,找到 系统-功率 分别在使用电池与外接电源场景下,将面板自刷新关掉 其它几个自适应亮度、显…

如何通过PLM项目管理软件提升产品开发效率的7个关键步骤

产品开发效率对于企业的竞争力至关重要。在当今复杂多变的商业环境中,如何有效提升产品开发效率成为众多企业关注的焦点。产品生命周期管理(PLM)作为一种整合产品全生命周期信息的管理理念和技术,为提升产品开发效率提供了有力的支持。通过合理运用PLM,企业能够优化流程、…