洛谷P4009汽车加油行驶问题——网络流24题(最短路)
题目: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题(最短路)的更多相关文章
- 洛谷 P4009 汽车加油行驶问题 解题报告
P4009 汽车加油行驶问题 题目描述 给定一个\(N×N\)的方形网格,设其左上角为起点◎,坐标(1,1) ,\(X\)轴向右为正,\(Y\)轴向下为正,每个方格边长为1 ,如图所示. 一辆汽车从起 ...
- 洛谷P4009 汽车加油行驶问题(分层最短路)
传送门 说好的网络流24题呢……上次是状压dp,这次怎么又最短路了…… 不过倒是用这题好好学了一下分层图最短路 把每一个位置$(x,y)$,油量剩余$k$表示为一个状态,然后转化成一个$n$进制数,这 ...
- 洛谷P4009 汽车加油行驶问题
题目描述 给定一个 N \times NN×N 的方形网格,设其左上角为起点◎,坐标(1,1)(1,1),XX 轴向右为正, YY 轴向下为正,每个方格边长为 11 ,如图所示. 一辆汽车从起点◎出发 ...
- 洛谷 P4009 汽车加油行驶问题 【最小费用最大流】
分层图,建k层,设(i,j,0)为点(i,j)的满油状态,全图的流量都是1,因为重复走到一个点没有意义.如果当前点是加油站,那么它向它上左的点连费用为a的边,向下右连费用为a+b的边: 否则,这个点的 ...
- 洛谷 P2763 试题库问题(网络流24题之一)
题目描述 «问题描述: 假设一个试题库中有n道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性.现要从题库中抽取m 道题组成试卷.并要求试卷包含指定类型的试题.试设计一个满足要求的组卷算法. ...
- 洛谷-p2764(最小路径覆盖)(网络流24题)
#include<iostream> #include<algorithm> #include<queue> #include<cstring> #in ...
- P4009 汽车加油行驶问题
P4009 汽车加油行驶问题 最短路 清一色的spfa....送上一个堆优化Dijkstra吧(貌似代码还挺短) 顺便说一句,堆优化Dj跑分层图灰常好写 #include<iostream> ...
- 【网络流24题】 No.15 汽车加油行驶问题 (分层图最短路i)
[题意] 问题描述:给定一个 N*N 的方形网格,设其左上角为起点◎, 坐标为( 1, 1), X 轴向右为正, Y轴向下为正, 每个方格边长为 1, 如图所示. 一辆汽车从起点◎出发驶向右下角终点▲ ...
- Luogu P4009 汽车加油行驶问题
题目链接 \(Click\) \(Here\) 分层图..好长时间没写差点要忘了\(hhhhh\),其实思路还是很明了的. 注意需要强制消费. #include <bits/stdc++.h&g ...
随机推荐
- UVA - 10603 Fill(隐式图搜索)
题目大意:经典的倒水问题. 给你三个瓶子,体积为a,b,c. 刚開始a.b是空的,c是满的,如今要求你到出体积为d的水.倒水的规则为,要么倒水方为空,要么接水方满 问倒到容量为d时,倒水的最小体积是多 ...
- java 发送微信客服消息
package com.baosight.wechat.service; import net.sf.json.JSONObject; import org.apache.commons.httpcl ...
- odoo税金处理
税金可以设置为'税金包含在价格中',或者'税金不包含在价格中'. 在税金计算处理过程中,odoo会将价格/金额按 total_included/ total_exincluded 分开 ...
- 串匹配算法讲解 -----BF、KMP算法
参考文章: http://www.matrix67.com/blog/archives/115 KMP算法详解 http://blog.csdn.net/yaochunnian/artic ...
- ubuntu环境准备
一. 桌面方面看起来比较不爽,12的版本用起更不习惯,决定改成命令行登陆 a. vi /ect/default/grub 文件 b. 修改成第二个红框的情况 c. 执行update-grub命令 d ...
- Mysql导出大量数据
outfile 导出文件 select name from t1 into outfile "/tmp/test.txt" infile 导入文件 导入到表t1中的name ...
- ARM Holdings
http://en.wikipedia.org/wiki/Advanced_RISC_Machines ARM Holdings (Redirected from Advanced RISC Mac ...
- 为基于 x86 的 Android* 游戏选择合适的引擎
摘要 游戏开发者知道 Android 中蕴藏着巨大的机遇. 在 Google Play 商店的前 100 款应用中,约一半是游戏应用(在利润最高的前 100 款应用中.它们所占的比例超过 90%). ...
- kubernetes故障现场一之Orphaned pod
系列目录 问题描述:周五写字楼整体停电,周一再来的时候发现很多pod的状态都是Terminating,经排查是因为测试环境kubernetes集群中的有些节点是PC机,停电后需要手动开机才能起来.起来 ...
- TCP 同步传输:客户端发送,服务器段接收
1.服务器端程序 可以在TcpClient上调用GetStream()方法来获的链接到远程计算机的网络流NetworkStream.当在客户端调用时,他获的链接服务器端的流:当在服务器端调用时,他获得 ...