传送门

说好的网络流24题呢……上次是状压dp,这次怎么又最短路了……

不过倒是用这题好好学了一下分层图最短路

把每一个位置$(x,y)$,油量剩余$k$表示为一个状态,然后转化成一个$n$进制数,这样每一个状态都可以唯一表示。能互相转移的状态之间连有向边,然后跑一个最短路就行了

具体细节看代码好了……细节太多说不清楚……

ps:据说还可以用这个思想跑费用流,我估摸着大概是建源$S$和汇$T$,$S$向起点连,终点向$T$连,容量$inf$,费用$0$,然后各个状态之间的容量都是$1$,费用就是对应的转移的代价,跑个最小费用流就好了,因为用的也是spfa,似乎没啥区别(这整个ps都是这傻逼在口胡切勿当真)

 //minamoto
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[<<],*p1=buf,*p2=buf;
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,:;}
inline int read(){
#define num ch-'0'
char ch;bool flag=;int res;
while(!isdigit(ch=getc()))
(ch=='-')&&(flag=true);
for(res=num;isdigit(ch=getc());res=res*+num);
(flag)&&(res=-res);
#undef num
return res;
}
const int N=,M=,inf=0x3f3f3f3f;
int n,k,p,b,c,tot;
bool vis[N],oil;
int d[N],q[M];
int head[N],Next[M],edge[M],ver[M];
inline void add(int x1,int y1,int z1,int x2,int y2,int z2,int e){
//可以理解成将这一个状态转化为一个n进制数
int u=n*n*(z1-)+(x1-)*n+y1,v=n*n*(z2-)+(x2-)*n+y2;
ver[++tot]=v,Next[tot]=head[u],head[u]=tot,edge[tot]=e;
}
void spfa(){
for(int i=;i<=n*n*(k+);++i) d[i]=inf;
int h,t;q[h=t=]=,d[]=;
while(h<=t){
int u=q[h++];
vis[u]=;
for(int i=head[u];i;i=Next[i]){
int v=ver[i];
if(d[v]>d[u]+edge[i]){
d[v]=d[u]+edge[i];
if(!vis[v]){
vis[v]=,q[++t]=v;
}
}
}
}
}
int main(){
n=read(),k=read(),p=read(),b=read(),c=read();
//k能走几条路,p加油费用,b逆行费用,c增设费用
for(int i=;i<=n;++i){
for(int j=;j<=n;++j){
oil=read();
for(int l=;l<=k;++l) add(i,j,l,i,j,l+,);
if(oil){
//如果不满,强制加满
//然后要往边上走的话油就变为2了
for(int l=;l<=k+;++l) add(i,j,l,i,j,,p);
if(i<n) add(i,j,,i+,j,,);
if(j<n) add(i,j,,i,j+,,);
if(i>) add(i,j,,i-,j,,b);
if(j>) add(i,j,,i,j-,,b);
}
else{
for(int l=;l<=k;++l){
if(i<n) add(i,j,l,i+,j,l+,);
if(j<n) add(i,j,l,i,j+,l+,);
if(i>) add(i,j,l,i-,j,l+,b);
if(j>) add(i,j,l,i,j-,l+,b);
}
//增设加油站
for(int l=;l<=k+;++l) add(i,j,l,i,j,,p+c);
}
}
}
spfa();
int ans=inf;
//终点的每一个状态:y+(x-1)*n+(k-1)*n*n
//即n+(n-1)*n+(k-1)*n*n=n*n+(k-1)*n*n=k*n*n
for(int i=;i<=k+;++i) cmin(ans,d[n*n*i]);
printf("%d\n",ans);
return ;
}

洛谷P4009 汽车加油行驶问题(分层最短路)的更多相关文章

  1. 洛谷 P4009 汽车加油行驶问题 解题报告

    P4009 汽车加油行驶问题 题目描述 给定一个\(N×N\)的方形网格,设其左上角为起点◎,坐标(1,1) ,\(X\)轴向右为正,\(Y\)轴向下为正,每个方格边长为1 ,如图所示. 一辆汽车从起 ...

  2. 洛谷P4009 汽车加油行驶问题

    题目描述 给定一个 N \times NN×N 的方形网格,设其左上角为起点◎,坐标(1,1)(1,1),XX 轴向右为正, YY 轴向下为正,每个方格边长为 11 ,如图所示. 一辆汽车从起点◎出发 ...

  3. 洛谷P4009汽车加油行驶问题——网络流24题(最短路)

    题目:https://www.luogu.org/problemnew/show/P4009 网络流24题中不是网络流的最短路题: 把每个点拆成各个油量上的点,根据要求连边即可: 注意:点数最大为10 ...

  4. 洛谷 P4009 汽车加油行驶问题 【最小费用最大流】

    分层图,建k层,设(i,j,0)为点(i,j)的满油状态,全图的流量都是1,因为重复走到一个点没有意义.如果当前点是加油站,那么它向它上左的点连费用为a的边,向下右连费用为a+b的边: 否则,这个点的 ...

  5. P4009 汽车加油行驶问题

    P4009 汽车加油行驶问题 最短路 清一色的spfa....送上一个堆优化Dijkstra吧(貌似代码还挺短) 顺便说一句,堆优化Dj跑分层图灰常好写 #include<iostream> ...

  6. Luogu P4009 汽车加油行驶问题

    题目链接 \(Click\) \(Here\) 分层图..好长时间没写差点要忘了\(hhhhh\),其实思路还是很明了的. 注意需要强制消费. #include <bits/stdc++.h&g ...

  7. 【洛谷 P4568】 [JLOI2011]飞行路线 (分层最短路)

    题目链接 分层图最短路. 把每个点拆成\(k+1\)个点,表示总共有\(k+1\)层. 然后每层正常连边, 若\((u,v)\)有边,则把每一层的\(u\)和下一层的\(v\).每一层的\(v\)和下 ...

  8. 【题解】【网络流24题】汽车加油行驶问题 [P4009] [Loj6223]

    [题解][网络流24题]汽车加油行驶问题 [P4009] [Loj6223] 传送门:汽车加油行驶问题 \([P4009]\) \([Loj6223]\) [题目描述] 给出一个 \(N \times ...

  9. 【网络流24题】 No.15 汽车加油行驶问题 (分层图最短路i)

    [题意] 问题描述:给定一个 N*N 的方形网格,设其左上角为起点◎, 坐标为( 1, 1), X 轴向右为正, Y轴向下为正, 每个方格边长为 1, 如图所示. 一辆汽车从起点◎出发驶向右下角终点▲ ...

随机推荐

  1. 从javascript的循环问题来看待闭包本质

    第一次接触这个问题还是在我刚开始学js的时候,当时就是一头雾水,时隔一年多了,突然又想起了这个问题,在这个春气盎然的周末,我就坐下来研究下并把结果和大家分享下: 先看代码:demo.html < ...

  2. Shell脚本 判断

    #Linux系统Shell脚本判断变量文件目录:权限.是否存在.空值.相等 1.字符串判断 str1 = str2 当两个串有相同内容.长度时为真str1 != str2 当串str1和str2不等时 ...

  3. 201671010127 2016-2017-8 回谈static修饰符

    上周学了泛型程序程序设计技术,再一次接触到了静态方法,那么今天就来谈一下static修饰符. static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块, ...

  4. 数据库SQL优化大总结之 百万级数据库优化方案 【转载】

    网上关于SQL优化的教程很多,但是比较杂乱.近日有空整理了一下,写出来跟大家分享一下,其中有错误和不足的地方,还请大家纠正补充. 这篇文章我花费了大量的时间查找资料.修改.排版,希望大家阅读之后,感觉 ...

  5. jar包上传到jcenter

    H:\[BOOT]\gradle-5.0-bin\gradle-5.0\gradle.properties # in $HOME/.gradle/gradle.properties java6Home ...

  6. 61-结点选择(树形dp)

     http://lx.lanqiao.cn/problem.page?gpid=T14 算法训练 结点选择   时间限制:1.0s   内存限制:256.0MB        问题描述 有一棵 n 个 ...

  7. 使用Python定时执行一任务,自动登录某web系统,生成报表,然后发送邮件给指定人员

    一.项目需求 每周从A系统生成一张Excel报表,发送此报表给指定人员,相关人员依据此报表去完成后续的工作. 项目限制: 1.无法通过EDI系统交互的方式从后台读取数据 2.由于公司网络环境限制,不能 ...

  8. ROS源码解读(二)--全局路径规划

    博客转载自:https://blog.csdn.net/xmy306538517/article/details/79032324 ROS中,机器人全局路径规划默认使用的是navfn包 ,move_b ...

  9. jQuery基础教程-第8章-003Providing flexible method parameters

    一.The options object 1.增加阴影效果 (function($) { $.fn.shadow = function() { return this.each(function() ...

  10. zigbee之MAC地址发送

    TI cc2530在出厂时候每一个芯片都固化了一个唯一的8个字节的地址,MAC或者IEEE地址. 协调器模块的MAC地址为:0x00124B000716550F(注意自己的是多少!!) 终端的MAC地 ...