【POJ3635】Full Tank 优先队列BFS
普通BFS:每个状态只访问一次,第一次入队时即为该状态对应的最优解。
优先队列BFS:每个状态可能被更新多次,入队多次,但是只会扩展一次,每次出队时即为改状态对应的最优解。
且对于优先队列BFS来说,每次存入队列的不光是像普通BFS的状态,还有当前状态对应的代价,并且是依据最小代价进行扩展。每次状态被更近之后,将其入队。
对于本题来说
状态选取:当前所在城市,当前油量
代价函数:当前状态所对应的最小花费
代码如下:
#include <cstdio>
#include <iostream>
#include <utility>
#include <algorithm>
#include <queue>
#include <memory.h>
#define cls(a,b) memset(a,b,sizeof(a))
using namespace std;
inline int read(){
int x=0,f=1;char ch;
do{ch=getchar();if(ch=='-')f=-1;}while(!isdigit(ch));
do{x=x*10+ch-'0';ch=getchar();}while(isdigit(ch));
return f*x;
}
int d[1001][101],cost[1001];
bool vis[1001][101];
int n,m,q;
int c,st,ed;
struct edge{
int to,w;
edge(int to=0,int w=0):to(to),w(w){}
};
vector<edge> G[1001];
inline void add_edge(int from,int to,int w){
G[from].push_back(edge(to,w));
G[to].push_back(edge(from,w));
}
int bfs(){
priority_queue< pair<int,pair<int,int> > > q;//存代价和状态
cls(vis,0);cls(d,0x3f);
d[st][0]=0;q.push(make_pair(0,make_pair(st,0)));
while(q.size()){
int city=q.top().second.first,fuel=q.top().second.second;q.pop();
if(vis[city][fuel])continue;//每个状态只会被扩展一次
if(city==ed)return d[city][fuel];//每个状态出队扩展时,对应最优解
vis[city][fuel]=1;//记录状态是否被扩展
if(fuel<c&&d[city][fuel+1]>d[city][fuel]+cost[city]){//满足条件,并且可以更新最优解
d[city][fuel+1]=d[city][fuel]+cost[city];
q.push(make_pair(-d[city][fuel+1],make_pair(city,fuel+1)));
}
for(int i=0;i<G[city].size();i++){
int to=G[city][i].to,w=G[city][i].w;
if(fuel>=w&&d[to][fuel-w]>d[city][fuel]){
d[to][fuel-w]=d[city][fuel];
q.push(make_pair(-d[to][fuel-w],make_pair(to,fuel-w)));//负号为改大根堆为小根堆
}
}
}
return -1;
}
void read_and_parse(){
n=read(),m=read();
for(int i=1;i<=n;i++)cost[i]=read();
for(int i=1;i<=m;i++){
int from=read()+1,to=read()+1,w=read();
add_edge(from,to,w);
}
}
void solve(){
q=read();
while(q--){
c=read(),st=read()+1,ed=read()+1;
int ans=bfs();
if(ans==-1)puts("impossible");
else printf("%d\n",ans);
}
}
int main(){
read_and_parse();
solve();
return 0;
}
【POJ3635】Full Tank 优先队列BFS的更多相关文章
- POJ3635 Full Tank? 优先队列BFS or 分层图最短路 or DP?
然而我也不知道这是啥啊...反正差不多...哪位大佬给区分一下QWQ.. 好的,我把堆的<写反了..又调了一个小时..你能不能稳一点.... 记录状态:所在位置u,油量c,花费w 扩展状态: 1 ...
- hdu 1026 Ignatius and the Princess I【优先队列+BFS】
链接: http://acm.hdu.edu.cn/showproblem.php?pid=1026 http://acm.hust.edu.cn/vjudge/contest/view.action ...
- ZOJ 649 Rescue(优先队列+bfs)
Rescue Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- Codeforces 677D - Vanya and Treasure - [DP+优先队列BFS]
题目链接:http://codeforces.com/problemset/problem/677/D 题意: 有 $n \times m$ 的网格,每个网格上有一个棋子,棋子种类为 $t[i][j] ...
- POJ 2449 - Remmarguts' Date - [第k短路模板题][优先队列BFS]
题目链接:http://poj.org/problem?id=2449 Time Limit: 4000MS Memory Limit: 65536K Description "Good m ...
- poj3635 FULL tank(TLE) 有限制的最短路(BFS搜索)。
用的BFS+优先队列+二进制压缩状态判重+链式前向星, TLE,好像有人这样过了...好像要用A*算法,还不太会,所以暂时放弃.但是也学会了很多,学习了链式前向星,更深理解了BFS求最优的时候,什么时 ...
- Battle City 优先队列+bfs
Many of us had played the game "Battle city" in our childhood, and some people (like me) e ...
- 【UESTC 482】Charitable Exchange(优先队列+bfs)
给你n个物品交换,每个交换用r,v,t描述,代表需要用r元的东西花费t时间交换得v元的东西.一开始只有1元的东西,让你求出交换到价值至少为m的最少时间代价.相当于每个交换是一条边,时间为边权,求走到价 ...
- cdoj 482 优先队列+bfs
Charitable Exchange Time Limit: 4000/2000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Othe ...
随机推荐
- spring boot 实现密码连续输入错误5次,限制十分钟内不能进行登录
我们要实现的就是,密码连续输入错误5次,就限制用户十分钟不能进行登录. 大致的流程图 数据库设计如下 DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ...
- 当给DataGrid的Itemssoure属性赋值引起TabControl_SelectionChanged事件
在TabControl的TabItem下布局了DataGrid控件时,当给dg.ItemsSource 赋值时会触发父控件的TabControl_SelectionChanged事件; 类似问题原因可 ...
- linux下日志文件error监控报警脚本分享
即对日志文件中的error进行监控,当日志文件中出现error关键字时,即可报警!(grep -i error 不区分大小写进行搜索"error"关键字,但是会将包含error大小 ...
- nginx的web缓存服务环境部署记录
web缓存位于内容源Web服务器和客户端之间,当用户访问一个URL时,Web缓存服务器会去后端Web源服务器取回要输出的内容,然后,当下一个请求到来时,如果访问的是相同的URL,Web缓存服务器直接输 ...
- python基础学习笔记(九)
python异常 python用异常对象(exception object)来表示异常情况.遇到错误后,会引发异常.如果异常对象并未被处理或捕捉,程序就会用所谓的 回溯(Traceback, 一种错误 ...
- 安装Visual Studio2013
安装Visual Studio2013现在官网下载在选择安装的可选功能这里,大家可以根据自己需要勾选,也可以默认全选.这里有个小功能,把鼠标放在文字上,会弹出各个功能的详细描述.选择四个常用的功能,另 ...
- 读书笔记(chapter3)
进程管理 3.1进程 1.进程:进程就是处于执行期的程序,实际上,进程就是正在执行的程序代码的实时结果: 2.执行线程,简称线程,是进程中活动的对象(每个线程拥有独立的程序计数器.进程栈.和一组进程寄 ...
- Genymotion安装总结
周末的时候为了测试论文中的Almond虚拟助手软件,所以要去Google Play上去下载. 但是我的两个安卓模拟器:夜神和海马玩模拟器的安卓版本太低了,导致无法使用 谷歌服务,所以连商店都进不去. ...
- 圆桌的项目Alpha冲刺(团队)
(a) 项目课堂演示 (b) 10篇冲刺随笔 冲刺之一 冲刺之二 冲刺之三 冲刺之四 冲刺之五 冲刺之六 冲刺之七 冲刺之八 冲刺之⑨ 冲刺之十 (c) 1篇测试随笔 测试随笔 (d) 1篇冲刺总结随 ...
- CentOS(6.8)7 安装 Mysql 5.7
https://blog.csdn.net/zyw_java/article/details/70949596 https://blog.csdn.net/yzl11/article/details/ ...