[网络流24题]汽车加油行驶问题
时间:2019-03-26
本文章向大家介绍[网络流24题]汽车加油行驶问题,主要包括[网络流24题]汽车加油行驶问题使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
分析
维护三个状态(x,y,k)表示当前坐标(x,y)和剩余流量k,dist(x,y,k)表示当前状态下的最小花费
到了每一个点分类讨论:
1.遇到油库,必须加满,以加满的状态继续转移
2.没有油库,设一个油库,并把油加满
3.没有油库,继续走
代码
最短路:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#define maxn 105
#define maxk 15
#define INF 0x3f3f3f3f
using namespace std;
int n,k,a,b,c;
int graph[maxn][maxn];
int dist[maxn][maxn][maxk];
int inq[maxn][maxn][maxk];
struct node{
int x;
int y;
int k;
node(){
}
node(int xpos,int ypos,int oil){
x=xpos;
y=ypos;
k=oil;
}
void debug(){
printf("(%d,%d) oil=%d money=%d\n",x,y,k,dist[x][y][k]);
}
};
queue<node>q;
const int walkx[4]={1,-1,0,0},walky[4]={0,0,1,-1};
int spfa(){
memset(dist,0x3f,sizeof(dist));
dist[1][1][k]=0;
inq[1][1][k]=1;
q.push(node(1,1,k));
while(!q.empty()){
node now=q.front();
q.pop();
// now.debug();
inq[now.x][now.y][now.k]=0;
if(graph[now.x][now.y]&&now.k!=k){//加油,加满达到k
if(dist[now.x][now.y][k]>dist[now.x][now.y][now.k]+a){
dist[now.x][now.y][k]=dist[now.x][now.y][now.k]+a;
if(!inq[now.x][now.y][k]){
inq[now.x][now.y][k]=1;
q.push(node(now.x,now.y,k));
}
}
continue;//遇到油库必须加油,不能不加油就走,所以要continue,下一次从加满油的状态开始更新
}
else{//设油库
if(dist[now.x][now.y][k]>dist[now.x][now.y][now.k]+a+c){
dist[now.x][now.y][k]=dist[now.x][now.y][now.k]+a+c;
if(!inq[now.x][now.y][k]){
inq[now.x][now.y][k]=1;
q.push(node(now.x,now.y,k));
}
}
}
for(int i=0;i<4;i++){
node nex;
nex.x=now.x+walkx[i];
nex.y=now.y+walky[i];
if(now.k<1) continue;
int w=0;//走的代价
if(nex.x<now.x||nex.y<now.y) w=b;
nex.k=now.k-1;
if(nex.x>=1&&nex.y>=1&&nex.x<=n&&nex.y<=n){
if(dist[nex.x][nex.y][nex.k]>dist[now.x][now.y][now.k]+w){
dist[nex.x][nex.y][nex.k]=dist[now.x][now.y][now.k]+w;
if(!inq[nex.x][nex.y][nex.k]){
inq[nex.x][nex.y][nex.k]=1;
q.push(nex);
}
}
}
}
}
int ans=INF;
for(int i=0;i<=k;i++) ans=min(ans,dist[n][n][i]);
return ans;
}
int main(){
scanf("%d %d %d %d %d",&n,&k,&a,&b,&c);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
scanf("%d",&graph[i][j]);
}
}
printf("%d",spfa());
}
- HDUOJ---1195Open the Lock
- 停止MySQL服务hang的问题简单分析(一)
- HDUOJ----2952Counting Sheep
- Golang语言社区--【基础知识】函数
- HDUOJ1060Leftmost Digit
- 轻量级交互数据json格式初探
- Golang语言社区--【基础知识】语言数组
- HDUOJ1086You can Solve a Geometry Problem too
- Golang语言社区--【基础知识】常量
- HDUOJ------1058 Humble Numbers
- MySQL偏移量的一点分析
- HDUOJ------------1051Wooden Sticks
- HDUOJ-----2068RPG的错排
- MySQL创建表失败的问题
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 百万级类别的分类模型的拆分训练
- 关于Spring定义的preDestroy修饰的方法不执行,有以下两种原因,总有一款适合你
- CSP201912-2-回收站选址题目解析-Java ,
- Spring boot框架快速入门
- SpringBoot 跨域问题:Access to XMLHttpRequest at ‘***‘ from origin ‘***‘ has been blocked by CORS policy
- 火车购票-CSP201609-2-Java
- 从后端开发人员的视角:最浅显的理解 Vue
- Sublime怎么默认显示文件路径
- Git 删除已提交的文件
- Sublime 怎么装SQL语法检测器
- Vue 设置环境变量和模式
- 你真的掌握了Python基本语法了吗?
- Mybatis-Generator 代码生成器的使用
- 提高数据分析工作效率-Sublime如何设置默认打开文件格式
- 使用 freemarker 制作代码生成器