【刷题】LOJ 6223 「网络流 24 题」汽车加油行驶问题
题目描述
给定一个 \(\text{N}\times \text{N}\) 的方形网格,设其左上角为起点◎,坐标为 \(\text{(1,1)}\) ,\(\text{X}\) 轴向右为正, \(\text{Y}\) 轴向下为正,每个方格边长为 1
,如图所示。
一辆汽车从起点◎出发驶向右下角终点▲,其坐标为 \((\text{N},\text{N})\) 。
在若干个网格交叉点处,设置了油库,可供汽车在行驶途中加油。汽车在行驶过程中应遵守如下规则:
汽车只能沿网格边行驶,装满油后能行驶 \(\text{K}\) 条网格边。出发时汽车已装满油,在起点与终点处不设油库。
汽车经过一条网格边时,若其 \(\text{X}\) 坐标或 \(\text{Y}\) 坐标减小,则应付费用 \(\text{B}\) ,否则免付费用。
汽车在行驶过程中遇油库则应加满油并付加油费用 \(\text{A}\) 。
在需要时可在网格点处增设油库,并付增设油库费用 \(\text{C}\) (不含加油费用 \(\text{A}\) )。
\(N , K , A , B , C\) 均为正整数, 且满足约束: \(2\leq \text{N} \leq 100, 2 \leq \text{K} \leq 10\) 。
设计一个算法,求出汽车从起点出发到达终点的一条所付费用最少的行驶路线。
输入格式
文件的第一行是 \(\text{N,K,A,B,C}\) 的值。
第二行起是一个 \(\text{N}*\text{N}\) 的 0
-1
方阵,每行 \(N\) 个值,至 \(\text{N}+1\) 行结束。
方阵的第 \(\text{i}\) 行第 \(\text{j}\) 列处的值为 1
表示在网格交叉点 \((\text{i},\text{j})\) 处设置了一个油库,为 0
时表示未设油库。各行相邻两个数以空格分隔。
输出格式
程序运行结束时,输出最小费用。
样例
样例输入
9 3 2 3 6
0 0 0 0 1 0 0 0 0
0 0 0 1 0 1 1 0 0
1 0 1 0 0 0 0 1 0
0 0 0 0 0 1 0 0 1
1 0 0 1 0 0 1 0 0
0 1 0 0 0 0 0 1 0
0 0 0 0 1 0 0 0 1
1 0 0 1 0 0 0 1 0
0 1 0 0 0 0 0 0 0
样例输出
12
数据范围与提示
\(2\leq n\leq 100\)
\(2 \leq k \leq 10\)
题解
又不是网络流
设 \(f[i][j]\) 代表到 \(i\) 号点,油量为 \(j\) 的最小代价
跑类似SPFA的东西就好了
#include<bits/stdc++.h>
#define ui unsigned int
#define ll long long
#define db double
#define ld long double
#define ull unsigned long long
const int MAXN=10000+10,MAXK=10+5,inf=0x3f3f3f3f;
int n,m,k,A,B,C,G[110][110],f[MAXN][MAXK],p[MAXN][MAXK],dr[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
struct node{
int x,y,w;
};
std::queue<node> q;
template<typename T> inline void read(T &x)
{
T data=0,w=1;
char ch=0;
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')w=-1,ch=getchar();
while(ch>='0'&&ch<='9')data=((T)data<<3)+((T)data<<1)+(ch^'0'),ch=getchar();
x=data*w;
}
template<typename T> inline void write(T x,char ch='\0')
{
if(x<0)putchar('-'),x=-x;
if(x>9)write(x/10);
putchar(x%10+'0');
if(ch!='\0')putchar(ch);
}
template<typename T> inline void chkmin(T &x,T y){x=(y<x?y:x);}
template<typename T> inline void chkmax(T &x,T y){x=(y>x?y:x);}
template<typename T> inline T min(T x,T y){return x<y?x:y;}
template<typename T> inline T max(T x,T y){return x>y?x:y;}
inline int id(int x,int y)
{
return (x-1)*n+y;
}
inline void SPFA()
{
memset(f,inf,sizeof(f));
q.push((node){1,1,k});
f[1][k]=0;
p[id(1,1)][k]=1;
while(!q.empty())
{
node pr=q.front();
q.pop();
int x=pr.x,y=pr.y,pt=id(x,y),w=pr.w;
p[pt][w]=0;
if(G[x][y]&&w!=k)
{
if(f[pt][w]+A<f[pt][k])
{
f[pt][k]=f[pt][w]+A;
if(!p[pt][k])p[pt][k]=1,q.push((node){x,y,k});
}
continue;
}
else if(!G[x][y])
{
if(f[pt][w]+C+A<f[pt][k])
{
f[pt][k]=f[pt][w]+C+A;
if(!p[pt][k])p[pt][k]=1,q.push((node){x,y,k});
}
}
if(w)
{
for(register int i=0;i<4;++i)
{
int dx=x+dr[i][0],dy=y+dr[i][1];
if(dx<1||dx>n||dy<1||dy>n)continue;
if(f[id(dx,dy)][w-1]>f[pt][w]+(i>1?B:0))
{
f[id(dx,dy)][w-1]=f[pt][w]+(i>1?B:0);
if(!p[id(dx,dy)][w-1])p[id(dx,dy)][w-1]=1,q.push((node){dx,dy,w-1});
}
}
}
}
}
int main()
{
read(n);read(k);read(A);read(B);read(C);
for(register int i=1;i<=n;++i)
for(register int j=1;j<=n;++j)read(G[i][j]);
SPFA();
int ans=inf;
for(register int i=0;i<=k;++i)chkmin(ans,f[id(n,n)][i]);
write(ans,'\n');
return 0;
}
【刷题】LOJ 6223 「网络流 24 题」汽车加油行驶问题的更多相关文章
- 【刷题】LOJ 6227 「网络流 24 题」最长k可重线段集问题
题目描述 给定平面 \(\text{xoy}\) 上 \(n\) 个开线段组成的集合 \(\text{I}\) ,和一个正整数 \(k\) ,试设计一个算法. 从开线段集合 \(\text{I}\) ...
- [luogu_P1251][LOJ#6008]「网络流 24 题」餐巾计划
[luogu_P1251][LOJ#6008]「网络流 24 题」餐巾计划 试题描述 一个餐厅在相继的 \(N\) 天里,第 \(i\) 天需要 \(R_i\) 块餐巾 \((i=l,2,-,N)\) ...
- [LOJ#6002]「网络流 24 题」最小路径覆盖
[LOJ#6002]「网络流 24 题」最小路径覆盖 试题描述 给定有向图 G=(V,E).设 P 是 G 的一个简单路(顶点不相交)的集合.如果 V 中每个顶点恰好在 P 的一条路上,则称 P 是 ...
- loj #6014. 「网络流 24 题」最长 k 可重区间集
#6014. 「网络流 24 题」最长 k 可重区间集 题目描述 给定实直线 L LL 上 n nn 个开区间组成的集合 I II,和一个正整数 k kk,试设计一个算法,从开区间集合 I II 中选 ...
- loj #6013. 「网络流 24 题」负载平衡
#6013. 「网络流 24 题」负载平衡 题目描述 G 公司有 n nn 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使 n nn 个仓库的库存数量相同.搬运货物时 ...
- loj #6122. 「网络流 24 题」航空路线问题
#6122. 「网络流 24 题」航空路线问题 题目描述 给定一张航空图,图中顶点代表城市,边代表两个城市间的直通航线.现要求找出一条满足下述限制条件的且途经城市最多的旅行路线. 从最西端城市出发,单 ...
- loj #6121. 「网络流 24 题」孤岛营救问题
#6121. 「网络流 24 题」孤岛营救问题 题目描述 1944 年,特种兵麦克接到国防部的命令,要求立即赶赴太平洋上的一个孤岛,营救被敌军俘虏的大兵瑞恩.瑞恩被关押在一个迷宫里,迷宫地形复杂, ...
- loj #6226. 「网络流 24 题」骑士共存问题
#6226. 「网络流 24 题」骑士共存问题 题目描述 在一个 n×n\text{n} \times \text{n}n×n 个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘上 ...
- [loj #6003]「网络流 24 题」魔术球 二分图最小路径覆盖,网络流
#6003. 「网络流 24 题」魔术球 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测试数据 ...
随机推荐
- HTML5 本地存储的用法
HTML5 的本地存储 API 中的 localStorage 与 sessionStorage 在使用方法上是相同的,区别在于 sessionStorage 在关闭页面后即被清空,而 localSt ...
- Retry模式
Retry模式能够通过重复之前失败的操作来处理那些在调用远端服务或者网络资源的时候发生的一些可以预期的临时性的错误.Retry模式可以提高应用的稳定性. 问题 应用中,负责链接其他服务的组件必须要对环 ...
- POJ 2388&&2299
排序(水题)专题,毕竟如果只排序不进行任何操作都是极其简单的. 事实上,排序算法十分常用,在各类高级的算法中往往扮演着一个辅助的部分. 它看上去很普通,但实际的作用却很大.许多算法在失去排序后将会无法 ...
- STM32烧录的常用方式
stm32烧录常用的方式一般为ST-LINK(或者J-tag)下载仿真和ISP下载 一.仿真器下载 仿真器分为J-TAG和SWD仿真,SWD仿真只需要4根线(VCC.GND.CLK.DATA)就可以了 ...
- 11.7 (下午)开课二个月零三天 (PDO)
PDO访问方式操作数据库 mysqli是专门访问MySQL数据库的,不能访问其它数据库.PDO可以访问多种的数据库,它把操作类合并在一起,做成一个数据访问抽象层,这个抽象层就是PDO,根据类操作对 ...
- maven 相关问题
maven 这里要更新完 不一定非要clean install 那个出问题了再弄,一般刷新一下maven仓库就行了,最好还是用自己配置的maven,不容易出问题
- 【中间件】Redis 实战之主从复制、高可用、分布式
目录 简介 持久化 主从复制 高可用 Redis-Sentinel .NET Core开发 分布式 Redis-Cluster 配置说明 常见问题 简介 本节内容基于 CentOS 7.4.1708, ...
- React半科普文
React半科普文 什么是React getting started 文件分离 Server端编译 定义一个组件 使用property 组件嵌套 组件更新 Virtual DOM react nati ...
- Jmeter目录文件讲解
1.bin:核心可执行文件,包含配置 2.windows启动文件:jmeter.bat mac或linux启动文件:jmeter jmeter-server:mac或linux分布式压测启动文件 jm ...
- 使用Fidder从安卓模拟器获取APP内H5游戏网址
大家都知道H5游戏其实是网页,但是有些APP或者微端不显示网址链接.这里给大家介绍介绍一种,利用Fiddler进行抓包,获取APP打开的网址的方法.有人说何必多此一举呢,直接用模拟器玩游戏就好了.的确 ...