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

题解:P6961 [NEERC 2017] Journey from Petersburg to Moscow

好像没有严谨证明的题解(可能只是我没有看到),于是我来写一个。

本文作者是 MZMTab@ https://www.luogu.com.cn/user/1046687 ,原文 https://www.luogu.com.cn/article/uoovmlgo 和 https://www.cnblogs.com/MZMTab/p/19616541 如果您能直接看到这段文字而在本页没有转载提示,或以“原创”名义发出,说明您访问的是侵权内容,请联系管理员删除文章并处罚侵权人,十分感谢您的见义勇为之举。

我们假设已经知道第 \(k\) 大的边权为 \(w\),则我们可以把边权大于等于 \(w\) 的边的边权 \(x\) 全部变成 \(x-w\),小于 \(w\) 的边权全部变成 \(0\),再跑最短路。答案就是 \(d_n + k \times w\)。其中 \(d_n\) 表示 \(1 \to n\) 的在新图上的最短路长度。

但是现在我们不知道真正的第 \(k\) 大的边权是多少,我们考虑稀里糊涂的枚举每一条边,把它当作第 \(k\) 大的边权再来跑,得到的结果对答案的影响。

为了方便证明,我们先符号化一下。

按题目中的符号 \(1 \to n\) 的一条路径上有 \(l\) 条边,依次记为 \(c_1,c_2,\cdots,c_l\),不妨令 \(c_1 \ge c_2 \ge \cdots \ge c_l\)

真实的答案 \(A= \sum \limits_{i=1} ^k c_i = \sum \limits _{i=1 } ^l \max (c_i -c_k ,0) + k \times c_k\),我们钦定第 \(t\) 条边为第 \(k\) 大的边后得到的答案 \(A_t = \sum \limits _{i=1 } ^l \max (c_i -c_t ,0) + k \times c_t\)

  1. \(c_t = c_k\),显然 \(A=A_t\)
  2. \(c_t < c_k \Rightarrow t>k\),即我们钦定的这条边更小。

\[\begin{align*} A - A_t &= \sum _{i=1} ^ l \big [ \max(c_i-c_k,0) -\max(c_i- c_t,0) \big ] + k \times ( c_k-c_t)\\ &= \sum _{i=1} ^k [(c_i - c_k) - (c_i - c_t)] + \sum _{i=k+1} ^t [0 - (c_i - c_t)] + \sum _{i=t+1} ^l [0-0] + k \times ( c_k-c_t)\\ &=k \times ( c_t-c_k) + \sum _{i=k+1} ^t (c_t-c_i) + k \times ( c_k-c_t) \\ &= \sum _{i=k+1} ^t (c_t-c_i) \end{align*} \]

\(i \le t \Rightarrow c_i \ge c_t\),故 \(A \le A_t\)

  1. \(c_t > c_k \Rightarrow t < k\),即我们钦定的边更大。

\[\begin{align*} A - A_t &= \sum _{i=1} ^ l \big [ \max(c_i-c_k,0) -\max(c_i- c_t,0) \big ] + k \times ( c_k-c_t)\\ &=\sum _{i=1 } ^t [(c_i - c_k) - (c_i - c_t)] + \sum _{t+1} ^ k [(c_i - c_k) - 0] + \sum _{i=k+1} ^ l [0-0] + k \times ( c_k-c_t)\\ &= t \times (c_t- c_k ) + \sum _{t+1} ^ k (c_i - c_k) + k \times ( c_k-c_t) \\ &= \sum _{i=t+1} ^ k (c_i - c_k +c_k-c_t) \\ &= \sum _{i=t+1} ^ k (c_i -c_t) \end{align*} \]

\(i > t \Rightarrow c_i \le c_t\),故 \(A \le A_t\)

本文作者是 MZMTab@ https://www.luogu.com.cn/user/1046687 ,原文 https://www.luogu.com.cn/article/uoovmlgo 和 https://www.cnblogs.com/MZMTab/p/19616541 如果您能直接看到这段文字而在本页没有转载提示,或以“原创”名义发出,说明您访问的是侵权内容,请联系管理员删除文章并处罚侵权人,十分感谢您的见义勇为之举。

综上所述,\(\forall 1 \le t \le l,A \le A_t\),且 \(\exist 1 \le t \le l,A=A_t\)。该结论对于每一条路径都成立,而我们又是在求最短路,所以答案一定能取到。证毕!

用 dijkstra 实现最短路,复杂度为 \(\Theta(m^2 \log n)\)

最后放一下代码。

#include <bits/stdc++.h>
using namespace std;
const int N=3e3+10;
using ll=long long;
namespace Graph{struct _edge{int v,nxt,w;}es[N*2];int head[N],gcnt;using pii=pair<ll,int>;ll dis[N];bool vis[N];priority_queue<pii,vector<pii>,greater<pii> >pq;void add_edge(int u,int v,int w){es[++gcnt]={v,head[u],w};head[u]=gcnt;}void clear(){memset(head,0,sizeof head);gcnt=0;}void dijkstra(int s){memset(dis,0x3f,sizeof dis);memset(vis,0,sizeof vis);dis[s]=0;pq.emplace(0,s);while(!pq.empty()){int u=pq.top().second;pq.pop();if(vis[u]) continue;vis[u]=1;for(int i=head[u];i;i=es[i].nxt){int v=es[i].v;if(dis[v]>dis[u]+es[i].w){dis[v]=dis[u]+es[i].w;pq.emplace(dis[v],v);}}}}
}
struct edge{int u,v,w;
}Es[N];
int n,m,K;
int main(){cin.tie(0)->sync_with_stdio(0);cin>>n>>m>>K;for(int i=1;i<=m;i++) cin>>Es[i].u>>Es[i].v>>Es[i].w;ll ans=0x3ff3f3f3f3f3f3f;for(int i=0;i<=m;i++){Graph::clear();for(int j=1;j<=m;j++){if(Es[j].w<Es[i].w){Graph::add_edge(Es[j].u,Es[j].v,0);Graph::add_edge(Es[j].v,Es[j].u,0);}else{Graph::add_edge(Es[j].u,Es[j].v,Es[j].w-Es[i].w);Graph::add_edge(Es[j].v,Es[j].u,Es[j].w-Es[i].w);}}Graph::dijkstra(1);ans=min(ans,Graph::dis[n]+1ll*K*Es[i].w);}printf("%lld\n",ans);return 0;
}
本文作者是 MZMTab@ https://www.luogu.com.cn/user/1046687 ,原文 https://www.luogu.com.cn/article/uoovmlgo 和 https://www.cnblogs.com/MZMTab/p/19616541 如果您能直接看到这段文字而在本页没有转载提示,或以“原创”名义发出,说明您访问的是侵权内容,请联系管理员删除文章并处罚侵权人,十分感谢您的见义勇为之举。
http://www.jsqmd.com/news/382616/

相关文章:

  • 题解:P12213 [蓝桥杯 2023 国 Python B] 最长回文前后缀
  • 沃尔玛购物卡怎么处理划算?这些妙招让你轻松回血! - 京顺回收
  • 想用U盘,必须使用windows7
  • 数字员工推动AI销冠系统与AI提效软件系统实现高效业务转型
  • 教鞭神器,网课老师必备
  • 北方水垢重灾区选购建议:2026 强力阻垢净水器排行,菲浦斯领先 - 水业策论
  • AutoGLM-Phone 9B 端侧智能体:基于 vLLM 与 Docker 的云端部署与 ADB 联调指南 - 实践
  • Win11关闭自动更新,windows11如何永久禁止自动更新
  • GTK4 GObject深度剖析
  • 【高效】Win11如何禁止系统自动更新 Win11关闭系统自动更新的方法
  • Zig 简介:C 的现代化继任者
  • 【信息科学与工程学】信息科学领域第四十八篇 计量工程
  • 智慧交通沥青路面损伤缺陷检测数据集VOC+YOLO格式547张4类别
  • web ui 测试显式等待深度解析
  • 题解:P15301 [ROI 2012 Day 2] army 汗国军队
  • CMake:现代C/C++工程的构建中枢
  • web ui 测试隐式等待深度解析
  • web ui 测试智能等待深度解析
  • Hive SQL优化:分区表+分桶表提升查询效率
  • 医疗仪器整机研发设计怎么做?2026创新合规智能化趋势指南|新纪元必读 - 匠言榜单
  • Nightwatch.js深度解析
  • 【Docker进阶篇】Docker Compose 实战:一键启动Web+数据库+缓存,微服务环境部署不再绕弯
  • C++中链表的虚拟头结点:应用场景与运用时机
  • 2026年 电感厂家推荐排行榜:共模电感/贴片电感/PFC电感/扁平线共模电感/工字电感/贴片功率电感/贴片绕线电感/色环电感/磁环电感/大电流电感/数字功放电感 - 品牌企业推荐师(官方)
  • 【Docker进阶篇】Docker Compose实战:Spring Boot与Redis服务名通信全解析
  • langGraph从入门到精通(四)——基于LangGraph的State状态模式设计 - 指南
  • 关于凸性的 things(wqs + slope trick + 闵可夫斯基和)
  • 【Docker进阶篇】拒绝重复构建镜像!.env文件+Profile实现多环境无缝切换
  • 华为OD机考双机位C卷 - 测试用例执行计划 (Java Python JS GO C++ C)
  • 手摸手在扣子平台搭建周报智能体[特殊字符]