CF1473E Minimum Path

  • description
  • solution
  • code

description

题目链接

solution

看到 ∑i=1kwei\sum_{i=1}^kw_{e_i}∑i=1k​wei​​ 的式子,就应该联想到最短路

先考虑题目的弱化版,去掉 max,min\text{max},\text{min}max,min 的限制,变成一条路径中的一条边不要花费,一条边花费加倍,再求最短路

贪心地 djikstra\text{djikstra}djikstra 跑最短路,发现是与原题对应的

设 dpi,j,k(j,k∈[0,1])dp_{i,j,k}(j,k\in[0,1])dpi,j,k​(j,k∈[0,1]) 表示到 iii 点时,jjj 是否加倍了一条边,kkk 是否不要一条边花费的最短路

则有转移方程:
dpv,j,k=min⁡(dpv,j,k,dpu,j,k+wu,v)dp_{v,j,k}=\min(dp_{v,j,k},dp_{u,j,k}+w_{u,v}) dpv,j,k​=min(dpv,j,k​,dpu,j,k​+wu,v​)

dpv,1,k=min⁡(dpv,1,k,dpu,0,k+wu,v∗2)dp_{v,1,k}=\min(dp_{v,1,k},dp_{u,0,k}+w_{u,v}*2) dpv,1,k​=min(dpv,1,k​,dpu,0,k​+wu,v​∗2)

dpv,j,1=min⁡(dpv,j,1,dpu,j,0)dp_{v,j,1}=\min(dp_{v,j,1},dp_{u,j,0}) dpv,j,1​=min(dpv,j,1​,dpu,j,0​)

最后答案为 min⁡(dpi,0,0,dpi,1,1)\min(dp_{i,0,0},dp_{i,1,1})min(dpi,0,0​,dpi,1,1​) 【路径可能只有一条,max,min\text{max},\text{min}max,min 相互抵消】

实际上,也可以理解为把一个点拆成四个点后跑最短路

分别对应不同的操作,先加倍再不要,先不要再加倍

code

#include <queue>
#include <cstdio>
#include <vector>
#include <iostream>
using namespace std;
#define int long long
#define maxn 1000005
#define Pair pair < int, int >
priority_queue < Pair, vector < Pair >, greater < Pair > > q;
vector < Pair > G[maxn];
int n, m;
int dis[maxn];
bool vis[maxn];void addedge( int u, int v, int w ) { G[u].push_back( { v, w } ); }signed main() {scanf( "%lld %lld", &n, &m );//分层图 [1,n]表示第一层  [n+1,2n]表示使用加倍层  [2n+1,3n]表示使用不要层  [3n+1,4n]最后转移的结果层 //对应操作是加倍后不要x->x+n->x+3n 不要后加倍x->x+2n->x+3n for( int i = 1, u, v, w;i <= m;i ++ ) {scanf( "%lld %lld %lld", &u, &v, &w );addedge( u, v, w ), addedge( v, u, w );addedge( u + n, v + n, w ), addedge( v + n, u + n, w );addedge( u + n * 2, v + n * 2, w ), addedge( v + n * 2, u + n * 2, w );addedge( u + n * 3, v + n * 3, w ), addedge( v + n * 3, u + n * 3, w );addedge( u, v + n, w * 2 ), addedge( v, u + n, w * 2 ); //加倍 addedge( u, v + n * 2, 0 ), addedge( v, u + n * 2, 0 ); //不要 addedge( u + n, v + n * 3, 0 ), addedge( v + n, u + n * 3, 0 );  //加倍后不要 addedge( u + n * 2, v + n * 3, w * 2 ), addedge( v + n * 2, u + n * 3, w * 2 ); //不要后加倍 }for( int i = 1;i <= ( n << 2 );i ++ ) dis[i] = 1e18;q.push( { dis[1] = 0, 1 } );while( ! q.empty() ) {int u = q.top().second; q.pop();if( vis[u] ) continue;vis[u] = 1;for( int i = 0;i < G[u].size();i ++ ) {int v = G[u][i].first, w = G[u][i].second;if( dis[v] > dis[u] + w ) {dis[v] = dis[u] + w;q.push( { dis[v], v } );}}}for( int i = 2;i <= n;i ++ ) printf( "%lld ", min( dis[i], dis[i + n * 3] ) );return 0;
}

CF1473E Minimum Path(拆点+最短路)相关推荐

  1. codeforces1473 E.Minimum Path(分层图最短路)

    E - Minimum Path 分层图最短路 第一个分层图 第0层就是按照题中给的点连边,从第0层到第1层我们连一条边权是0的边,从第1层到第2层连一条边权是原先边权2倍的边,当然第1层以及第2层之 ...

  2. [leetcode] Minimum Path Sum

    Minimum Path Sum Given a m x n grid filled with non-negative numbers, find a path from top left to b ...

  3. 63. Unique Paths II and 64. Minimum Path Sum

    文章目录 1 63 Unique Paths II 1.1 题目描述 1.2 动态规划解决 2 64. Minimum Path Sum 2.1 题目理解 2.2 动态规划 这一遍刷dp的题目就很轻松 ...

  4. 【NOIP2017】逛公园 拆点最短路+拓扑(记忆化搜索

    题目描述 策策同学特别喜欢逛公园.公园可以看成一张N个点M条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,N号点是公园的出口,每条边有一个非负权值, 代表策策经过这条边所要花的时间. 策 ...

  5. 【leetcode】Minimum Path Sum

    Minimum Path Sum Given a m x n grid filled with non-negative numbers, find a path from top left to b ...

  6. 【DP】LeetCode 64. Minimum Path Sum

    LeetCode 64. Minimum Path Sum Solution1:标准的动态规划题目 class Solution { public:int minPathSum(vector<v ...

  7. 图论 ---- E. Minimum Path(分层图最短路 用分层图对边权操作进行选择)

    题目链接 题目大意: 两点间最短路的定义变成:所有的边之和−max+min所有的边之和-max+min所有的边之和−max+min 解题思路: 这里很明显就是变成了最短路的时时候就是把路径上边权最小值 ...

  8. Minimum Path Sum

    Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which ...

  9. LeetCode Minimum Path Sum(动态规划)

     Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right wh ...

最新文章

  1. 彻底搞懂MySQL分区
  2. Python第三周 学习笔记(2)
  3. vue中checkbox 样式自定义重写;循环遍历checkbox,拿到不同的v-model绑定值;及获取当前checked 状态,全选和全不选等功能。...
  4. Visual C++——黄维通《 Visual C++面向对象与可视化程序设计》——习题4-11
  5. 深入了解DSP与ARM的区别与联系
  6. ObjectArx R14-2007下载地址
  7. java代码ftp重命名未生效_java实现FTP远程文件移动(重命名、复制、拷贝) | 学步园...
  8. 与孩子一起学编程python_与孩子一起学编程(Python读书笔记3)
  9. 【jQuery笔记Part1】03-jQuery加载模式对比JS
  10. 开关电源BOOST升压原理
  11. 华为手机照片 计算机,教你华为手机怎么传照片到电脑上去
  12. 开发一个微信小程序实例教程
  13. SAR图像:拟合杂波时常用的分布
  14. 只能选择分卷文件的第一部分_2021学年高一数学新教材必修第一册精讲精练培优讲义(更新第4章,网盘免费下)...
  15. reg、wire与logic的区别
  16. sae wpa3加密方式_WPA3:四大安全新特性技术分析
  17. 仓库摆放示意图_仓库合理堆放标准,货物入库摆放规范
  18. JAVA简易二手交易系统
  19. CISA-信息系统审计流程-抽样方法
  20. 你真的会选择前端培训班吗

热门文章

  1. 资料分享 | R语言资料分享来袭
  2. android方块密码输入框,Android仿微信/支付宝的方块密码输入框
  3. linux浏览器不能播放音频文件夹,在html中插入音频文件在浏览器中播放音频文件的兼容性问题...
  4. android技术积累,Android开发中积累的一些报错的解决方法
  5. wince导航_宁可用手机导航,也不用汽车导航?
  6. pygame里面物体闪烁运动_Pygame-游戏中的运动
  7. acwing2058. 笨拙的手指(进制转换)
  8. [SpringBoot2]@MatrixVariableUrlPathHelper
  9. [Java基础]反射获取成员方法并使用
  10. 奔小康赚大钱 HDU - 2255( 二分图匹配KM算法详解)