[POJ 3635] Full Tank?
Description
已知每个点的加油站的油价单价(即点权),每条路的长度(边权)。
有q个询问,每个询问包括起点s、终点e和油箱容量c。
问从起点走到终点的最小花费。如果不可达输出impossible,否则输出最小的旅途费用。
Solution
第一想法想到拆点,每个点拆成 0~c 那么多个点,妥妥TLE。
后来看题解想到可以进行一个最短路DP,用一个三元组 (x,y,z) 表示当前在点 x,花了 y 元,油量为 z,把这个压进优先队列,每次取出堆中 y 最少的点进行更新即可。
这里还有个奇技淫巧般的优化,就是每次取出堆顶时,不用从当前直接把油箱加满,只加 1 单位的油量就够了,这是为什么呢?其实跟飞扬的小鸟一样,为了优化时间,我们可以让 dp 从自己向自己转移,也就是说,这次只加 1 单位,下次取出时还是只加 1 单位,那么迟早会遍历所有的 n*c 状态。
哦对还要注意一点,vis 数组不要在 if 里面更新,要在取到它的时候再变为 1,不然早早变为 1 有可能让能令其更优的状态无法转移过来。
Code
// By YoungNeal
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int T;
int c,s,e;
int n,m,cnt;
];
];
][];
][];
struct Edge{
int nxt,to,dis;
}edge[];
void add(int x,int y,int z){
edge[++cnt].to=y;
edge[cnt].nxt=head[x];
edge[cnt].dis=z;
head[x]=cnt;
}
struct Node{
int now,dis,oil;
Node(,,):now(now),dis(dis),oil(oil){}
friend bool operator<(Node a,Node b){
return a.dis>b.dis;
}
};
priority_queue<Node> pq;
void dij(){
while(pq.size()) pq.pop();
pq.push(Node(s,,));
while(pq.size()){
Node p=pq.top();pq.pop();
int o=p.oil,u=p.now;
if(vis[u][o]) continue;
vis[u][o]=;
if(u==e){
printf("%d\n",p.dis);
return;
}
<=c&&!vis[u][o+]&&dis[u][o+]>dis[u][o]+val[u]){
dis[u][o+]=p.dis+val[u];
pq.push(Node(u,p.dis+val[u],o+));
}
for(int i=head[u];i;i=edge[i].nxt){
int to=edge[i].to;
int w=edge[i].dis;
if(o>=w&&!vis[to][o-w]&&dis[to][o-w]>p.dis){
dis[to][o-w]=p.dis;
pq.push(Node(to,p.dis,o-w));
}
}
}
printf("impossible\n");
}
signed main(){
scanf("%d%d",&n,&m);
;i<=n;i++) scanf("%d",&val[i]);
;i<=m;i++){
scanf("%d%d%d",&x,&y,&z);
add(x+,y+,z);
add(y+,x+,z);
}
scanf("%d",&T);
while(T--){
scanf("%d%d%d",&c,&s,&e);
s++,e++;
memset(vis,,sizeof vis);
memset(dis,0x3f,sizeof dis);
dis[s][]=;
dij();
}
;
}
[POJ 3635] Full Tank?的更多相关文章
- POJ 3635 - Full Tank? - [最短路变形][手写二叉堆优化Dijkstra][配对堆优化Dijkstra]
题目链接:http://poj.org/problem?id=3635 题意题解等均参考:POJ 3635 - Full Tank? - [最短路变形][优先队列优化Dijkstra]. 一些口胡: ...
- POJ 3635 Full Tank? 【分层图/最短路dp】
任意门:http://poj.org/problem?id=3635 Full Tank? Time Limit: 1000MS Memory Limit: 65536K Total Submis ...
- POJ 3635 - Full Tank? - [最短路变形][优先队列优化Dijkstra]
题目链接:http://poj.org/problem?id=3635 Description After going through the receipts from your car trip ...
- poj 3635 Full Tank? ( bfs+dp思想 )
Full Tank? Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5857 Accepted: 1920 Descri ...
- poj 3635 Full Tank? ( 图上dp )
题意: 已知每一个点的加油站的油价单位价格(即点权).每条路的长度(边权). 有q个询问.每一个询问包含起点s.终点e和油箱容量. 问从起点走到终点的最小花费.假设不可达输出impossible,否则 ...
- 【POJ 3635】 Full Tank
[题目链接] http://poj.org/problem?id=3635 [算法] 优先队列BFS 实现类似于堆优化dijkstra [代码] #include <algorithm> ...
- Full Tank? POJ - 3635 (bfs | 最短路)
After going through the receipts from your car trip through Europe this summer, you realised that th ...
- poj 3635/hdu 1676 Full Tank? 车辆加油+最短路
http://acm.hdu.edu.cn/showproblem.php?pid=1676 给出一张图,n<=1000,m<=10000. 有一辆车想从图的一个地方到达另外一个地方,每个 ...
- poj 3635(bfs+优先队列)
题目链接:http://poj.org/problem?id=3635 思路:本题主要运用的还是贪心思想,由于要求st->ed的最小花费,那么每经过一个城市,能不加油就尽量不加油,用dp[i][ ...
随机推荐
- MySQL 5.7 多主一丛同步的数据库配置(将多处数据源合并到一点)
工作需要,笔记之用.文章很长,倒一杯茶慢慢看. 数据库的应用场景颇多,如 数据库双机同步,一主多从,多主多从,多主一从等:下文记录多主一从的配置及测试. 大多数复制场景中是一主或者一主多从.这种拓扑用 ...
- Minicom串口工具安装及配置
Minicom串口工具安装及配置 1. 简述 嵌入式开发多采用串口线连接电脑进行开发及调试. 2 安装及配置串口工具(以Minicom为例) Tiny4412开发板提供的有RS232电平的DB9公头接 ...
- qwe框架- CNN 实现
CNN实现 概述 我在qwe中有两种,第一种是按照Ng课程中的写法,多层循环嵌套得到每次的"小方格",然后WX+b,这样的做法是最简单,直观.但是效率极其慢.基本跑个10张以内图片 ...
- php和java中的加密和解密
遇到的java代码如下: Cipher cipher=Cipher.getInstance("DESede/CBC/PKCS5Padding"); 在php中使用des算法 始终校 ...
- GitHub上最火的Android开源项目(一)
GitHub在中国的火爆程度无需多言,越来越多的开源项目迁移到GitHub平台上.更何况,基于不要重复造轮子的原则,了解当下比较流行的Android与iOS开源项目很是必要.利用这些项目,有时能够让你 ...
- FusionCharts重写单系列图
/** * @Title:FusionChart.java * @Package:com.yhd.chart.model * @Description:封装FusionChart单系列图 * @aut ...
- HighCharts之2D堆条状图
HighCharts之2D堆条状图 1.HighCharts之2D堆条状图源码 StackedBar.html: <!DOCTYPE html> <html> <head ...
- mpeg文件格式分析
MPEG-1流比特层次结构分析总结 1.简要介绍Mpeg 2.Mpeg-1数据流分析 2.1视频序列层(VideoStream) 2.2画面组层(GOP) 2.3画面层(Pictures) 2.4片层 ...
- Django学习-9-ORM多对多操作
创建多对多: 方式一:自定义关系表 class Host(models.Model): nid = mo ...
- java实现在线支付
国内电子商务系统实现的基本流程如下: 客户在系统内下订单 -> 系统根据订单生成支付宝接口url -> 客户通过url使用支付宝(网上银行)付款 -> 支付宝将客户的付款完成信息发送 ...