[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][ ...
随机推荐
- 区块链 PoW 与 PoS 的纷争
最近在研究区块链,可能会有一些非前端文章,感兴趣的可以关注关注哟. 有关注区块链的,肯定会经常看到这两个名词 -- PoW 与 PoS.但是很多人对他们的含义的理解存在很多偏差.那么他们的含义与区别是 ...
- java I/O框架 (二)文件操作(File)
1.介绍 java io中最常操作的就是我们电脑中的文件,将这些文件以流的形式本地读写,或者上传到网络上.java中的File类就是对这些存储于磁盘上文件的虚拟映射,这也体现了java面向对象的思想, ...
- R语言︱文本挖掘之中文分词包——Rwordseg包(原理、功能、详解)
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者寄语:与前面的RsowballC分词不同的 ...
- zTree实现地市县三级级联Service接口测试
zTree实现地市县三级级联Service接口测试 ProvinceServiceTest.java: /** * @Title:ProvinceServiceTest.java * @Package ...
- VME总线
简介 诞生于25年前的VME(VersaModule Eurocard)总线是一种通用的计算机总线,结合了Motorola公司Versa总线的电气标准和在欧洲建立的Eurocard标准的机械形状因子, ...
- pat1071-1080
1071 #include<iostream> #include<cstdio> #include<cstring> #include<vector> ...
- jQuery.extend 函数使用详解
JQuery的extend扩展方法: Jquery的扩展方法extend是我们在写插件的过程中常用的方法,该方法有一些重载原型,在此,我们一起去了解了解. 一.Jquery的扩展方 ...
- Ubuntu出现ERR_PROXY_CONNECTION_FAILED错误解决方案
我是Ubuntu新手,因为想查看国外的资料,然后安装了灯笼,结果打开谷歌浏览器出现了ERR_PROXY_CONNECTION_FAILED错误,未连接到互联网,代理服务器出现错误,然后Firefox也 ...
- [HNOI2013]消毒
题目大意: 网址:https://www.luogu.org/problemnew/show/3231 大意:a×b×c的三维空间里有a×b×c个点(x,y,z),其中有些点需要被消除. 消除的方法为 ...
- iOS开发——自定义转场动画
首先是UIPresentationController,这个控制器给modal新的viewController提供了下一步的view和转场的管理,从一个viewController被modal出来到被 ...