AcWing:176. 装满的油箱(bfs + dijiskla思想)
有N个城市(编号0、1…N-1)和M条道路,构成一张无向图。
在每个城市里边都有一个加油站,不同的加油站的单位油价不一样。
现在你需要回答不超过100个问题,在每个问题中,请计算出一架油箱容量为C的车子,从起点城市S开到终点城市E至少要花多少油钱?
输入格式
第一行包含两个整数N和M。
第二行包含N个整数,代表N个城市的单位油价,第i个数即为第i个城市的油价pipi。
接下来M行,每行包括三个整数u,v,d,表示城市u与城市v之间存在道路,且车子从u到v需要消耗的油量为d。
接下来一行包含一个整数q,代表问题数量。
接下来q行,每行包含三个整数C、S、E,分别表示车子油箱容量、起点城市S、终点城市E。
输出格式
对于每个问题,输出一个整数,表示所需的最少油钱。
如果无法从起点城市开到终点城市,则输出”impossible”。
每个结果占一行。
数据范围
1≤N≤10001≤N≤1000,
1≤M≤100001≤M≤10000,
1≤pi≤1001≤pi≤100,
1≤d≤1001≤d≤100,
1≤C≤1001≤C≤100
输入样例:
5 5
10 10 20 12 13
0 1 9
0 2 8
1 2 1
1 3 11
2 3 7
2
10 0 3
20 1 4
输出样例:
170
impossible
算法:bfs + dijiskla思想
题解:这题是用bfs + 优先队列来做,而且需要用到dijiskla的思想,那么我们可以用枚举法来做,首先从起点出发,先加一升油试一下,加一升油能到达的站点放入队列,因为队列是以花费钱来从小到大排序,所以我在把这个加了一升油的情况放入队列,如果这个加了一升油的情况还是花费最小的话,我就会继续加第二升油,如果不是的话,那么我就会用到其他的。到最后的时候,可能最开始第一个点的加一升油还没有用到,那是因为它并不是最优解,你思考一下,多加一升油的性价比就不高了,你还会去多加n升油吗,所以之后的解就都不是我们要找的最优解,之后就是重复我最开始所说的加一升油试一试这个思路。如果还是不够理解的话,可以看代码,代码上也有解释哟!
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <memory.h> using namespace std; const int maxn = 1e4+; struct node {
int u, f, w;
friend bool operator < (node a, node b) { //优先队列重载,权值小的排前面
return a.w > b.w;
}
}; vector<pair<int, int> > g[maxn]; int n, m;
int wn[maxn];
int dp[maxn][];
int vis[maxn][];
int c, s, e; bool check1(int u, int f) { //判断是否能够在当前站点加一升油
if(f + <= c && !vis[u][f + ] && dp[u][f + ] > dp[u][f] + wn[u]) { //如果能加一升油,并且加这升油一定比原来的那个好(原来的那个可能是初始化的INF,也可能是已经经过的这个地方时更新的值)
return true;
}
return false;
} bool check2(int f, int v, int p, int w) { //判断下一个站点是否能走
if(f >= p && !vis[v][f - p] && dp[v][f - p] > w) { //如果当前油要大于需要花费的油,并且原来的费用比现在的要高(同理,可能是INF,也可能是更新过的值)
return true;
}
return false;
} int bfs() {
priority_queue<node> q;
memset(vis, , sizeof vis);
memset(dp, 0x3f3f3f3f, sizeof dp);
dp[s][] = ;
q.push((node){s, , });
while(!q.empty()) {
node now = q.top();
q.pop();
int u = now.u;
int f = now.f;
int w = now.w;
vis[u][f] = ;
if(u == e) {
return w;
}
if(check1(u, f)) { //先加一升油试一下
dp[u][f + ] = dp[u][f] + wn[u];
q.push((node){u, f + , dp[u][f + ]});
}
int len = g[u].size();
for(int i = ; i < len; i++) {
int v = g[u][i].first;
int p = g[u][i].second;
if(check2(f, v, p, w)) {
dp[v][f - p] = w;
q.push((node){v, f - p, w});
}
}
}
return -; //无解
} int main() {
scanf("%d %d", &n, &m);
for(int i = ; i < n; i++) {
scanf("%d", &wn[i]);
}
for(int i = ; i <= m; i++) {
int u, v, w;
scanf("%d %d %d", &u, &v, &w);
g[u].push_back(make_pair(v, w));
g[v].push_back(make_pair(u, w));
}
int q;
scanf("%d", &q);
while(q--) {
scanf("%d %d %d", &c, &s, &e);
int ans = bfs();
if(ans == -) {
printf("impossible\n");
} else {
printf("%d\n", ans);
}
}
return ;
}
AcWing:176. 装满的油箱(bfs + dijiskla思想)的更多相关文章
- hdu 4845 状压bfs(分层思想)
拯救大兵瑞恩 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Subm ...
- BFS 简单思想以及代码
BFS(广搜思想) 广度优先搜索 广度优先搜索是图论的搜索算法之一,以下便进行简单叙述 对于每一个顶点来说,都存在着三种颜色 白色,灰色,黑色 而对于每个顶点,都有三种数据类型 颜色类型,前驱或者父节 ...
- poj 3635 Full Tank? ( bfs+dp思想 )
Full Tank? Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5857 Accepted: 1920 Descri ...
- 快速切题 sgu116. Index of super-prime bfs+树思想
116. Index of super-prime time limit per test: 0.25 sec. memory limit per test: 4096 KB Let P1, P2, ...
- AcWing:177. 噩梦(bfs)
给定一张N*M的地图,地图中有1个男孩,1个女孩和2个鬼. 字符“.”表示道路,字符“X”表示墙,字符“M”表示男孩的位置,字符“G”表示女孩的位置,字符“Z”表示鬼的位置. 男孩每秒可以移动3个单位 ...
- acwing 173. 矩阵距离(bfs)
给定一个N行M列的01矩阵A,A[i][j] 与 A[k][l] 之间的曼哈顿距离定义为: dist(A[i][j],A[k][l])=|i−k|+|j−l|dist(A[i][j],A[k][l]) ...
- 题解【AcWing176】装满的油箱
题面 一开始拿到这个问题并不好做,于是考虑拆点. 考虑将一个点拆成 \(c+1\) 个,每个点表示(编号,剩余油量). 然后 \(\text{Dijkstra}\) 最短路即可. 每次跑 \(\tex ...
- nyoj 21-三个水杯(BFS)
21-三个水杯 内存限制:64MB 时间限制:1000ms Special Judge: No accepted:7 submit:18 题目描述: 给出三个水杯,大小不一,并且只有最大的水杯的水是装 ...
- BFS/DFS算法介绍与实现(转)
广度优先搜索(Breadth-First-Search)和深度优先搜索(Deep-First-Search)是搜索策略中最经常用到的两种方法,特别常用于图的搜索.其中有很多的算法都用到了这两种思想,比 ...
随机推荐
- 禅道工具的下载和使用(原地址:https://www.cnblogs.com/ydnice/p/5800256.html)
下载地址:http://sourceforge.net/projects/zentao/files/8.2/ZenTaoPMS.8.2.stable.exe/download 1.解压ZenTaoPM ...
- makemigrations和migrate到底干了什么以及如何查询原生的sql语句
在你改动了 model.py的内容之后执行下面的命令: python manger.py makemigrations 相当于 在该app下建立 migrations目录,并记录下你所有的关于mode ...
- javaIO——LineNumberReader
LineNumberReader 是java字符流中的一员,它继承自 BufferedReader,只是在 BufferedReader 基础上,提供了对当前流位置所在文本行的标记记录.先来看看定义: ...
- GC原理图
GC原理图,Jdk1.6及以下版本 永久代 永久代是Hotspot虚拟机特有的概念,是方法区的一种实现,别的JVM都没有这个东西.在Java 8中,永久代被彻底移除,取而代之的是另一块与堆不相连的本地 ...
- 利用axis调用webservice接口
一.首先把wsdl文件放入eclipse中某个项目中的src目录下 二.右键弹出webservice,然后点击webservice菜单,选中genernator client ,选择axis生成Jav ...
- 红外 NEC编码
它是一种电磁波,可以实现数据的无线传输 它的波长范围为760nm ~ 1mm,不为人眼所见 紫外光波长为10-400nm 红外与蓝牙 红外:对准.直接.0-10米,单对单 蓝牙:10米左右,加强信号后 ...
- vue项目前端限制页面长时间未操作超时退出到登录页
之前项目超时判断是后台根据token判断的,这样判断需要请求接口才能得到返回结果,这样就出现页面没有接口请求时还可以点击,有接口请求时才会退出 现在需要做到的效果是:页面超过30分钟未操作时,无论点击 ...
- 编译luacheck Linux版
最近在写Visual Studio Code的Lua插件,需要把luacheck集成进去.但是luacheck默认只提供了win32版本,见https://github.com/mpeterv/lua ...
- windows10 L2tP nat 下无法连接的处理
事件查看器中没有错误代码显示. Windows 10 L2TP/IPsec Manual Setup Instructions Bold items are things you will click ...
- PAT Basic 1061 判断题 (15 分)
判断题的评判很简单,本题就要求你写个简单的程序帮助老师判题并统计学生们判断题的得分. 输入格式: 输入在第一行给出两个不超过 100 的正整数 N 和 M,分别是学生人数和判断题数量.第二行给出 M ...