题目:https://www.luogu.org/problemnew/show/P4009

网络流24题中不是网络流的最短路题;

把每个点拆成各个油量上的点,根据要求连边即可;

注意:点数最大为100*100*11,因为虽然k<=10,但还有k=0的状态!(竟然因为边界调了一晚上)

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
typedef long long ll;
queue<int>q;
int const MAXN=,inf=1e9;//MAXN不可为100005
int n,k,a,b,c,nd[][][],cnt,ct=,head[MAXN];
int dis[MAXN];
bool vis[MAXN];
struct N{
int to,next,w;
N(int t=,int n=,int w=):to(t),next(n),w(w) {}
}edge[MAXN*];
void spfa()
{
memset(dis,,sizeof dis);
int s=nd[k][][];
dis[s]=;vis[s]=;q.push(s);
while(q.size())
{
int x=q.front();q.pop();vis[x]=;
// cout<<x<<endl;
for(int i=head[x];i;i=edge[i].next)
{
int u=edge[i].to;
if(dis[u]>dis[x]+edge[i].w)
{
// cout<<dis[x]<<endl;
dis[u]=dis[x]+edge[i].w;
if(!vis[u])vis[u]=,q.push(u);
}
}
// cout<<q.size()<<endl;
}
// cout<<"spfa"<<endl;
// ll mn=inf;
// for(int l=0;l<=k;l++)
// mn=min(mn,dis[nd[l][n][n]]);
printf("%d",dis[cnt+]);
}
int main()
{
scanf("%d%d%d%d%d",&n,&k,&a,&b,&c);//a加油 b返回 c建库
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
for(int l=;l<=k;l++)
nd[l][i][j]=++cnt;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
{
bool d;
scanf("%d",&d);
if(!d)
{
edge[++ct]=N(nd[k][i][j],head[nd[][i][j]],a+c),head[nd[][i][j]]=ct;
for(int l=;l<=k;l++)
{
int x=nd[l][i][j];
if(i>)edge[++ct]=N(nd[l-][i-][j],head[x],b),head[x]=ct;
if(j>)edge[++ct]=N(nd[l-][i][j-],head[x],b),head[x]=ct;
if(i<n)edge[++ct]=N(nd[l-][i+][j],head[x],),head[x]=ct;
if(j<n)edge[++ct]=N(nd[l-][i][j+],head[x],),head[x]=ct;
// if(l<k)edge[++ct]=N(nd[k][i][j],head[x],a+c),head[x]=ct;//不优!
}
}
if(d)
{
int x=nd[k][i][j];
for(int l=;l<k;l++)
edge[++ct]=N(x,head[nd[l][i][j]],a),head[nd[l][i][j]]=ct;
if(i>)edge[++ct]=N(nd[k-][i-][j],head[x],b),head[x]=ct;
if(j>)edge[++ct]=N(nd[k-][i][j-],head[x],b),head[x]=ct;
if(i<n)edge[++ct]=N(nd[k-][i+][j],head[x],),head[x]=ct;
if(j<n)edge[++ct]=N(nd[k-][i][j+],head[x],),head[x]=ct;
}
}
for(int l=;l<=k;l++)
edge[++ct]=N(cnt+,head[nd[l][n][n]],),head[nd[l][n][n]]=ct;
// cout<<cnt<<endl;
spfa();
return ;
}

洛谷P4009汽车加油行驶问题——网络流24题(最短路)的更多相关文章

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

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

  2. 洛谷P4009 汽车加油行驶问题(分层最短路)

    传送门 说好的网络流24题呢……上次是状压dp,这次怎么又最短路了…… 不过倒是用这题好好学了一下分层图最短路 把每一个位置$(x,y)$,油量剩余$k$表示为一个状态,然后转化成一个$n$进制数,这 ...

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

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

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

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

  5. 洛谷 P2763 试题库问题(网络流24题之一)

    题目描述 «问题描述: 假设一个试题库中有n道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性.现要从题库中抽取m 道题组成试卷.并要求试卷包含指定类型的试题.试设计一个满足要求的组卷算法. ...

  6. 洛谷-p2764(最小路径覆盖)(网络流24题)

    #include<iostream> #include<algorithm> #include<queue> #include<cstring> #in ...

  7. P4009 汽车加油行驶问题

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

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

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

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

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

随机推荐

  1. 百科知识 ass文件如何打开

    直接拖入视频即可播放 鼠标右键 用记事本打开 也有一些软件支持比如POPSUB(也比较方便调整时间轴) 如果你是说如何加载字幕的话 用VOBSUB是最好的... ASS是视频的字幕,和视频放在同一文件 ...

  2. VUE高仿饿了么app开发思维导图

    来自互联网 文章来源:刘俊涛的博客 地址:http://www.cnblogs.com/lovebing

  3. WMS8_条码界面操作简要说明(包装作业)

    说明:条码界面的主要用途是包装作业 这个客户端,完全是JS实现的     可以从 All operation看板视图 Picking的表单视图                 All operatio ...

  4. python--简易员工信息系统编写

    补充内容:eval 将字符串变成变量名locals   看输入的是否是字典中的一个keyfunc.__name____怎么看变量名的数据类型斐波那契数列 li=[1,1] while li[-1]&l ...

  5. kubernetes高级之创建只读文件系统以及只读asp.net core容器

    系列目录 使用docker创建只读文件系统 容器化部署对应用的运维带来了极大的方便,同时也带来一些新的安全问题需要考虑.比如黑客入侵到容器内,对容器内的系统级别或者应用级别文件进行修改,会造成难以估量 ...

  6. 九度OJ 1085:求root(N, k) (迭代)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1407 解决:523 题目描述: N<k时,root(N,k) = N,否则,root(N,k) = root(N',k).N'为N的 ...

  7. 远程访问Linux的常见方式

    访问方式 不加密文字界面:telnet.rsh 加密文字界面:SSH 图形界面:Xdmcp.RDP.VNC SSH SSH用来取代finger.R shell(rlogin.rcp.rsh).teln ...

  8. define tensorflow and run it

    import tensorflow as tf a, b, c, d, e = tf.constant(5, name='input_a'), tf.constant(6, name='input_b ...

  9. 一步步玩pcDuino3--uboot下的ping,加入命令能够接受来自host的ping

    uboot是一个很优秀的开源项目.不只能够学习bootloader.嵌入式,各种总线协议. 还能够了解网络协议栈.在嵌入式开发中,常常使用uboot的tftp和nfs来加快开发的效率.那么在tftp能 ...

  10. spawn类参数command详解

    我们主要来看spawn类它的构造方法参数主要有command,从字面上就是指spawn类的子程序用来执行的子程序,也就是系统所能够执行的相应的命令,对于command这个参数,我们是以字符串的方式给出 ...