【刷题】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 上传者: 匿名 提交提交记录统计讨论测试数据 ...
随机推荐
- 理解ASP.NET的IDataReader
理解ASP.NET的IDataReader ADO.NET DataReader对象可以从数据库中检索只读.只进的数据流.因为每次在内存中的数据只有一行,所以使用DataReader可提高应用程序的性 ...
- array_map,array_filter,array_walk区别
这几个方法都有遍历数组,操作的过程. 很容易搞混.尤其很多人养成的编程习惯都是使用foreach来循环遍历.. 就举个简单例子. $a = array( 0,1,2,3,4,5,6,7,8,9 ); ...
- iscsi target IET架构
IET(iSCSI Enterprise Target)是内核态实现的iscsi target,相比于用户态实现的target(比如tgt),iet比较稳定,并且也算是历史悠久,io都直接经过内核态, ...
- CGAL学习:数据类型
CGAL 4.13 - Number Types 1 Introduction(介绍:略) 涉及到的数大致有3种:一是整数,二是有理数,三是浮点数.有理数可以用2个整数表示.精度上可分为任意精度和固定 ...
- 【CobaltStrike】CobaltStrike简介与使用
CobaltStrike简介与使用 0x00 简介 1. 什么是CobaltStrike?可以用来做什么? CobatStrike是一款基于java编写的全平台多方协同后渗透攻击框架.CobaltSt ...
- 20155227《网络对抗》Exp9 Web安全基础实践
20155227<网络对抗>Exp9 Web安全基础实践 实验内容 关于WebGoat Cross-Site Scripting(XSS)练习 Injection Flaws练习 CSRF ...
- 20155310 《网络对抗》Exp 8 Web基础
20155310 <网络对抗>Exp 8 Web基础 基础问题回答 (1)什么是表单 表单是一个包含表单元素的区域. 表单元素是允许用户在表单中(比如:文本域.下拉列表.单选框.复选框等等 ...
- LCA的一些算法
LCA,就是求树上任意两点的最近公共祖先 (本题图片与代码均为Luogu3379) 方法我好像讲过一个,这次把主要的三个一起讲一讲 <1> 倍增(O(n log n)) 我们先考虑最基本的 ...
- SQL面试整理(1)——数据库连接池
在web开发中,如果JSP.Servlet或EJB使用JDBC直接访问数据库,每一次数据访问请求都必须经历建立数据库连接,打开数据库,存取数据库和关闭数据库连接等操作步骤,如果频繁发生这种数据库操作, ...
- 利用Python统计微信联系人男女比例以及简单的地区分布
寒暄的话不多说,直接进入主题. 运行效果图: [准备环境] Python版本:v3.5及其以上 开发工具:随意,此处使用Pycharm [依赖包] 1.itchat (CMD运行:pip instal ...