原题题面

网络流24题?费用流?不存在的

tag都是骗人的

首先看题,仔细想想,这不就是一个最短路吗?

然而本蒟蒻看不出一些题解中说的分层图最短路,于是直接写单源最短路

从 (1,1) 往 (n,n) 跑最短路,以 dis[x][y][res] 来记录当位于 (x,y) 时还能再跑 res 条边的最小花费

每次扩展节点的时候更新加油的花费, 注意当(x,y) 有油库时强制加油,没有时可不加

最后 for i from 0 to k 统计 dis[n][n][i] 的最小值,即为答案

实现细节见代码

Tips:代码中含有 __gnu_pbds::priority_queue 与 std::tuple ,可能引起强烈不适,请谨慎食用

 1 #ifndef ONLINE_JUDGE
 2 #define _EXT_ENC_FILEBUF_H 1
 3 #define _EXT_CODECVT_SPECIALIZATIONS_H 1
 4 #endif // ONLINE_JUDGE
 5 #include<bits/stdc++.h>
 6 #include<bits/extc++.h>
 7 using namespace std;
 8 typedef tuple<int,int,int> pit; // x, y, res
 9 constexpr int fx[5][2]={{0,0},{1,0},{0,-1},{-1,0},{0,1}};
10 int n,K,A,B,C,ans=numeric_limits<int>::max();
11 int dis[150][150][20];
12 bool in[150][150][20],oil[150][150];
13 struct cmp{bool operator()(pit a,pit b)
14 {return dis[get<0>(a)][get<1>(a)][get<2>(a)]>dis[get<0>(b)][get<1>(b)][get<2>(b)];}};
15 __gnu_pbds::priority_queue<pit,cmp,__gnu_pbds::pairing_heap_tag> q;
16 void SPFA();
17 int main()
18 {
19     scanf("%d%d%d%d%d",&n,&K,&A,&B,&C);
20     for(int i=1;i<=n;i++)
21         for(int j=1;j<=n;j++){
22             int col;
23             scanf("%d",&col);
24             oil[i][j]=(col==1);
25         }
26     SPFA();
27     for(int i=0;i<=K;i++)
28         ans=min(ans,dis[n][n][i]);
29     printf("%d",ans);
30 }
31 void SPFA()
32 {
33     memset(dis,0x7f,sizeof(dis));
34     dis[1][1][K]=0;
35     in[1][1][K]=true;
36     q.push(make_tuple(1,1,K));
37     while(!q.empty()){
38         int x,y,res;
39         tie(x,y,res)=q.top();
40         q.pop();
41         in[x][y][res]=false;
42         if(oil[x][y]&&res!=K){
43             if(dis[x][y][K]>dis[x][y][res]+A){
44                 dis[x][y][K]=dis[x][y][res]+A;
45                 if(!in[x][y][K]){
46                     q.push(make_tuple(x,y,K));
47                     in[x][y][K]=true;
48                 }
49             }
50             continue;
51         }
52         if(dis[x][y][K]>dis[x][y][res]+A+C){
53             dis[x][y][K]=dis[x][y][res]+A+C;
54             if(!in[x][y][K]){
55                 q.push(make_tuple(x,y,K));
56                 in[x][y][K]=true;
57             }
58         }
59         if(res<=0) continue;
60         for(int i=1;i<=4;i++){
61             int xi=x+fx[i][0],yi=y+fx[i][1];
62             if(xi<1||xi>n||yi<1||yi>n) continue;
63             int cost=(xi<x||yi<y)?B:0;
64             if(dis[xi][yi][res-1]>dis[x][y][res]+cost){
65                 dis[xi][yi][res-1]=dis[x][y][res]+cost;
66                 if(!in[xi][yi][res-1]){
67                     q.push(make_tuple(xi,yi,res-1));
68                     in[xi][yi][res-1]=true;
69                 }
70             }
71         }
72     }
73 }

View Code

转载于:https://www.cnblogs.com/Sepia/p/10121810.html

洛谷 P4009 汽车加油行驶问题 题解相关推荐

  1. 洛谷 - P4009 汽车加油行驶问题(分层图最短路/最小费用最大流)

    题目链接:点击查看 题目大意:给出一个n*n的矩阵表示道路,途中有一些加油站,现在要从点(1,1)到达点(n,n),问最小花费,其中的一些规则如下: 汽车只能沿着网格边行驶,装满油后可以行驶K条边,出 ...

  2. Loj#6223 Luogu P4009 汽车加油行驶 分层图最短路

    这是本蒟蒻博客的第一篇文章,不规范之处敬请各位大佬指正和谅解orz Loj#6223+Luogu P4009 文章目录 前言 一.建模 二.代码实现 1.节点在图中的编号(分层图的存储) 2.建边 对 ...

  3. P4009 汽车加油行驶问题

    题目描述: 题解: 看了很多题解,无论什么解法都绕不开分层图 在本题中加满油的车每次可以移动K步,那么我们就可以建立一个K+1层的分层图,表示汽车油量k的状态(油量0-k),然后根据题目要求建图 首先 ...

  4. 孤岛营救与汽车加油行驶问题

    题目链接:https://www.luogu.org/problemnew/show/P4011 (孤岛营救)|| https://www.luogu.org/problemnew/show/P400 ...

  5. 【线性规划与网络流24题】汽车加油行驶问题 分层图

    汽车加油行驶问题 Time Limit: 1 Sec  Memory Limit: 128 MB Description 给定一个 N*N的方形网格,设其左上角为起点◎,坐标为( 1,1),X轴向右为 ...

  6. 洛谷P5520 [yLOI2019] 青原樱 题解

    洛谷P5520 [yLOI2019] 青原樱 题解 题目链接:P5520 [yLOI2019] 青原樱 题意: n n n 个空放 m m m 个物品,两两物品不能直接相邻,至少空一格 纯数学题. 看 ...

  7. 洛谷P5633 最小度限制生成树 题解

    洛谷P5633 最小度限制生成树 题解 题目链接:P5633 最小度限制生成树 题意: 给你一个有 n n n 个节点, m m m 条边的带权无向图,你需要求得一个生成树,使边权总和最小,且满足编号 ...

  8. 洛谷P2619 [国家集训队]Tree I 题解

    洛谷P2619 [国家集训队]Tree I 题解 题目链接:P2619 [国家集训队]Tree I 题意: 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有 need\text{n ...

  9. 洛谷P1282 多米诺骨牌 题解

    洛谷P1282 多米诺骨牌 题解 题目链接:P1282 多米诺骨牌 题意: 多米诺骨牌由上下 222 个方块组成,每个方块中有 1∼61\sim61∼6 个点.现有排成行的上方块中点数之和记为 S1S ...

最新文章

  1. [洛谷P4721]【模板】分治 FFT
  2. $_FILES error(笔记)
  3. 多线程Java Socket编程示例
  4. 计算php代码执行时间长短的类(精确到毫秒)
  5. nginx源码分析configure脚本详解
  6. SQL case when 2种用法
  7. java多线程实战指南_学习笔记《Java多线程编程实战指南》二
  8. python人脸识别程序如何嵌入到app_只用Python就能写安卓,简单几步实现人脸识别的App...
  9. 【会议】2008-10-27
  10. 高途发布2020年经德勤审计年报 CFO:16次做空已成谣言
  11. oracle进入到root用户,Linux环境中普通用户切换到root用户问题
  12. python小程序源代码_【程序源代码】Spring Boot 考试小程序
  13. IIS6上配置CGI有两个要点(转)
  14. Ubuntu 串口权限问题
  15. Leetcode 199.二叉树的右视图
  16. winform自定义用户控件
  17. 循环(概念、for循环、while循环 、do-while循环)
  18. vb常用内部函数(四):随机数函数
  19. 西门子PLC功能图的画法
  20. 洛谷OJ:P5960 【模板】差分约束算法

热门文章

  1. RealProxy AOP的实现
  2. ORA-01507: database not mounted
  3. GCD之线程挂起与恢复
  4. Memcached、MongoDB、Redis和tokyotyrant
  5. 解决asp.net 3.5sp1错误
  6. spark streaming性能优化
  7. (8)Verilog include 头文件使用路径(FPGA不积跬步101)
  8. (12)System Verilog 数组查找常数
  9. linux系统汇总的qt,QT 编程总结_Linux编程_Linux公社-Linux系统门户网站
  10. 结构pop_宏旺半导体总结嵌入式存储封装技术SiP、SOC、MCP、PoP的区别