「一本通 3.2 练习 6」汽车加油行驶

目录

第一步,二维转一维(此步仅为方便,可以省略)

第二步,建边(啥都行,只要死不了)

第三部,bfs(你要dfs也行)

第一步

第二步

第三步

可C+A呢?

剪枝(vis数组登场了!)

总结

A+C记录:又要戳我!

结语:

我的第二道网络流二十四题

链接:戳我

题目大致意思放一下

给你一个N*N零一方阵,你在(1,1),可以沿着边走。当你往左上走的时候,要付B元。你的体力是K,
也就是说每走K条边就要停下来。如果当前节点(不论你还能走多少条边)是1,需付A元钱将体力补满;
你也可以在0的节点付A+C(注意有个A,我当年37分就是卡在这里)元钱将体力补满。问到达(N,N)
需要多少钱

第一步,二维转一维(此步仅为方便,可以省略)

第二步,建边(啥都行,只要死不了)

第三部,bfs(你要dfs也行)

下面正式开始

第一步

首先,先写一个函数,我把它叫做 kks(请见谅)

输入 x 与 y

返回对应下标。

就像这样

int kks(int x,int y){return (x-1)*(n)+y;
}

接着,就可以愉快的开一维了!

第二步

这一步谁都会,直接把配套代码放出来了(我写了个链式前向星)

struct edge{int v,nxt,w;void it(int av,int anxt,int aw){v=av,nxt=anxt,w=aw;}
}e[N*4];
int h[N],cnt;
void addE(int u,int v){e[++cnt].it(v,h[u],((v<u)?b:0));h[u]=cnt;
}
int dx[]={1,-1,0,0},dy[]={0,0,1,-1};
bool hf(int abc){if(abc>0&&abc<=n)return 1;return 0;
}
for(int x=1;x<=n;x++)for(int y=1;y<=n;y++)for(int i=0;i<4;i++){int xx=dx[i]+x,yy=dy[i]+y;if(hf(xx)&&hf(yy))addE(kks(x,y),kks(xx,yy));}

第三步

重点来了!

我在建立边的时候,加入了边权,B的问题解决了

同时,我把输入的01矩阵写进了一个叫need的数组里

那么,A也解决了

可C+A呢?

按照正常思路,每一次都要枚举一遍,明显容易超时

但是,细细研究就会发现,只要在油量为0的时候加一下(这就是贪心思想,没有死到临头就依然放纵)

并且,同一个地方,一辆车不可能到2次(肯定不是最优解)

因此,建的油箱我们可以不计入讨论

剪枝(vis数组登场了!)

  1. 在到达同一地点时,油量相同时花钱越少越好
  2. 在到达同一地点时,油量更多时花钱越少越好
  3. 剪枝要在C+A与A之前,因为你多费点钱加油还不如不加呢

总结

到此为止,基本思路框架已经出现,接着就是代码了(很乱,见谅)

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,k,a,b,c;
const int N=10407;
struct edge{int v,nxt,w;void it(int av,int anxt,int aw){v=av,nxt=anxt,w=aw;}
}e[N*4];
int h[N],cnt,need[N],ans=0x3f3f3f3f;
int dx[]={1,-1,0,0},dy[]={0,0,1,-1};
int kks(int x,int y){return (x-1)*(n)+y;
}
bool hf(int abc){if(abc>0&&abc<=n)return 1;return 0;
}
void addE(int u,int v){e[++cnt].it(v,h[u],((v<u)?b:0));h[u]=cnt;
}
int vis[N][17];
struct p{int x,o,pr;p(int ax,int ao,int apr){x=ax;o=ao;pr=apr;}bool operator>(const p b) const{if(pr!=b.pr)return pr>b.pr;return o<b.o;}
};
void bfs(){memset(vis,0x3f,sizeof vis);priority_queue<p,vector<p>,greater<p>> pq;pq.push(p(kks(1,1),k,0));while(!pq.empty()){p now=pq.top();pq.pop();int x=now.x,o=now.o,pr=now.pr;//cout<<x<<" "<<o<<" "<<pr<<endl;int flg=0;if(x==kks(n,n)){ans=min(ans,pr);continue;}for(int i=o;i<=k;i++)if(vis[x][i]<=pr)flg=1;if(flg)continue;vis[x][o]=pr;if(need[x]&&o!=k)o=k,pr+=a;if(o==0)pr+=c+a,o=k;for(int i=h[x];i;i=e[i].nxt)pq.push(p(e[i].v,o-1,pr+e[i].w));}
}
signed main(){scanf("%lld%lld%lld%lld%lld",&n,&k,&a,&b,&c);for(int i=1;i<=n;i++)for(int j=1,ck;j<=n;j++){scanf("%lld",&ck);if(ck)need[kks(i,j)]=1;}for(int x=1;x<=n;x++)for(int y=1;y<=n;y++)for(int i=0;i<4;i++){int xx=dx[i]+x,yy=dy[i]+y;if(hf(xx)&&hf(yy))addE(kks(x,y),kks(xx,yy));}bfs();printf("%lld",ans);
}

A+C记录:又要戳我!

结语:

这题可以作为网络流二十四题的入门题

最后,祝您端午节快乐!
冒泡排序,选择排序,插入排序,快速排序,堆排序,归并排序,希尔排序,桶排序,基数排序,端午节帮您排忧解难。 
有向图,无向图,有环图,无环图,完全图,稠密图,稀疏图,拓扑图祝您端午节宏图大展。
最长路,最短路,单源路径,所有节点对路径,祝您新年路路通畅。 
二叉树,红黑树,van Emde Boas树,最小生成树祝您端午节好运枝繁叶茂。
最大流,网络流,标准输入流,标准输出流,文件输入流,文件输出流,祝您端午节顺顺溜溜。
线性动规,区间动规,坐标动规,背包动规,树型动归为您的端午节规划精彩。
散列表,哈希表,邻接表,双向链表,循环链表帮您在端午节表达喜悦。
O(n!), O(2^n), O(n^3), O(n^2), O(nlog n), O(n), O(log n), O(1), 祝您端午节渐进步步高!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/1085.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

fatal error: ‘type_traits‘ file not found错误解决

错误如下 In file included from ../test_opencv_qt/main.cpp:1: In file included from ../../Qt/6.5.1/android_x86_64/include/QtGui/QGuiApplication:1: In file included from ../../Qt/6.5.1/android_x86_64/include/QtGui/qguiapplication.h:7: In file included from .…

在?聊聊浏览器事件循环机制

目录 前言 同步/异步编程模型 同步 异步 JS异步模型 调用栈 任务队列 宏任务队列 微任务队列 微任务API 事件循环 队列优先级 混合队列 事件循环实现 总结 参考文章 Event-Loop可视化工具 前言 JS是单线程语言&#xff0c;在某个时间段只能执行一段代码。这…

SpringBoot 实现 PDF 添加水印有哪些方案?

简介 PDF&#xff08;Portable Document Format&#xff0c;便携式文档格式&#xff09;是一种流行的文件格式&#xff0c;它可以在多个操作系统和应用程序中进行查看和打印。在某些情况下&#xff0c;我们需要对 PDF 文件添加水印&#xff0c;以使其更具有辨识度或者保护其版…

.NET 8 Preview 4 中的 ASP.NET Core 更新

作者&#xff1a;Daniel Roth - Principal Program Manager, ASP.NET 翻译&#xff1a;Alan Wang 排版&#xff1a;Alan Wang .NET 8 Preview 4 现已可用&#xff0c;并包括了许多对 ASP.NET Core 的新改进。 以下是本预览版本中的新内容摘要&#xff1a; Blazor 使用 Blazor …

【软考网络管理员】2023年软考网管初级常见知识考点(26)- HTML常见属性标签、表格、表单详解

涉及知识点 Html的概念&#xff0c;html常见标签&#xff0c;html常见属性&#xff0c;html表格&#xff0c;html表单&#xff0c;软考网络管理员常考知识点&#xff0c;软考网络管理员网络安全&#xff0c;网络管理员考点汇总。 原创于&#xff1a;CSDN博主-《拄杖盲学轻声码…

基于matlab使用 YOLO V2深度学习进行多类对象检测(附源码)

一、前言 此示例演示如何训练多类对象检测器。 深度学习是一种强大的机器学习技术&#xff0c;可用于训练强大的多类对象检测器&#xff0c;例如 YOLO v2、YOLO v4、SSD 和 Faster R-CNN。此示例使用该函数训练 YOLO v2 多类室内对象检测器。经过训练的物体检测器能够检测和识…

设计模式—“领域规则”

在特定领域中,某些变化虽然频繁,但可以抽象为某种规则。这时候,结合特定领域,将问题抽象为语法规则,从而给出在该领域下的一般性解决方案。 典型模式有:Interpreter Interpreter 动机 在软件构建过程中,如果某一个特定领域的问题比较复杂,类似的结构不断重复出现,…

SpringBoot + Vue前后端分离项目实战 || 五:用户管理功能后续

系列文章&#xff1a; SpringBoot Vue前后端分离项目实战 || 一&#xff1a;Vue前端设计 SpringBoot Vue前后端分离项目实战 || 二&#xff1a;Spring Boot后端与数据库连接 SpringBoot Vue前后端分离项目实战 || 三&#xff1a;Spring Boot后端与Vue前端连接 SpringBoot V…

数字图像处理(三)

目录 实验六、图像分割方法 实验七、图像识别与分类 实验六、图像分割方法 一、实验目的 了解图像分割技术相关基础知识&#xff1b;掌握几种经典边缘检测算子的基本原理、实现步骤理解阈值分割、区域分割等的基本原理、实现步骤。理解分水岭分割方法的基本原理、实现方法。…

在 Mac 上安装 K8S

本篇文章将介绍如何在 Mac 上使用 minikube 搭建单机版的 Kubernetes。 安装步骤 安装 Docker 安装 docker 主要是用于提供容器引擎。直接下载安装即可。 下载地址 安装 Kubectl 推荐使用 home brew 安装 brew install kubectl可以使用下面的命令查看是否已经安装完毕 …

css实现鼠标悬停时滑出层提示

css实现鼠标悬停时滑出层提示的方法介绍 这是一个简单的鼠标悬停提示特效&#xff0c;类似于alt标签&#xff0c;不过这一种是用纯CSS实现&#xff0c;扩展性好&#xff0c;而且在提示的层里可以加入图片或其它布局&#xff0c;这个要根据你的需要了。 代码如下: <!DOCTYPE…

Flink基础概念及常识

1.flink入门 官方定义&#xff1a;Apache Flink是一个框架和分布式处理引擎&#xff0c;用于在无边界和有边界数据流上进行有状态的计算&#xff0c;Flink能在所有常见集群环境中运行&#xff0c;并能以内存速度和任意规模进行计算。 简言之&#xff0c;Flink是一个分布式的计…