Two Currencies

传送门
题意:一个图,要求从起点到各个点的最短时间。其中,每条路要花费一定钱a,一定时间b。起初s元,有无限金币可换钱。每个点都可以换无限数目的钱,每次得到c元,花费d时间。

思路:

会Dijkstra却不会带上dp的Dijkstra的我被自己菜哭,想了好久怎么处理每个点换多少钱,果然贪心不行dp来凑
其实思路不难,就是在图上进行dp

每个状态都做一次决策,要不要换钱。状态有两个,一个是dp的状态;一个是priority_queue优先队列中存的状态。状态dp[i][j]dp[i][j]dp[i][j]为到达点iii还剩余jjj元的最短时间。队列中的状态为三元组tuple(t,u,w)tuple(t,u,w)tuple(t,u,w)即此时时间过去了t秒,处于点u,还有w元。队列状态之间的转移,通过①连接两个点的边②换一次钱。按照Dijkstra的套路,从近到远(所需时间小到大)排序,抽取最近的点进行dp状态更新和队列状态转移。

与传统的Dijkstra不同的是,传统用vis数组记录有哪些点进来过,有哪些没有。这里通过是否dp[u][w]>tdp[u][w] > tdp[u][w]>t判重。(其实此处根本不需要判重,因为这里Dijkstra队列的形成必是时间递进的;而且有背包的上限,状态不会无限增加)

首先,我们得找到到达一个目的地可能需要的最多钱。来作为dp的背包上限。一共50个点,最远的地方是走了49条路,每条路最多花费50元,那么上限就是49×50=2450。即所有队列状态和dp状态的w小于等于2450。

接下来参考代码。

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=55;
const int maxm=2466;
const ll inf=0x3f3f3f3f3f3f3f3f;//long long最大值,8个3f
#define tp tuple<ll,ll,ll>vector<tp> G[maxn];//存每个点所能到达的点
ll c[maxn],d[maxn];//此点换钱的钱数和花费时间
ll dp[maxn][maxm];int main(){int n,m,s;scanf("%d%d%d",&n,&m,&s);s=min(2450,s);//防止越界,取2450(最大容量)以下。for(int i=1;i<=m;i++){ll u,v,a,b;scanf("%lld%lld%lld%lld",&u,&v,&a,&b);G[u].push_back(tp(v,a,b)); //点 钱 时间 G[v].push_back(tp(u,a,b));}for(int i=1;i<=n;i++)scanf("%d%d",&c[i],&d[i]);fill(dp[0],dp[0]+54*2465,inf);//全部初始化为inf的骚操作dp[1][s]=0;//初始化起点//优先队列,按照tuple三个值(从前往后)升序priority_queue<tp,vector<tp>,greater<tp>> pq;pq.push(tp(0,1,s));while(!pq.empty()){tp cur;cur=pq.top();pq.pop();ll t=get<0>(cur),u=get<1>(cur),w=get<2>(cur);//取tuple值if(dp[u][w]>t) continue; //可有可无的判重for(auto i:G[u]){//遍历vectorll v=get<0>(i),toa=get<1>(i),tob=get<2>(i);if(dp[v][w-toa]>t+tob&&w>=toa){//如果有足够钱可达且这样走比原有dp更快dp[v][w-toa]=t+tob;pq.push(tp(t+tob,v,w-toa));//存入状态}}if(dp[u][min(2450LL,w+c[u])]>t+d[u]){//如果充1次钱后比原有dp更快dp[u][min(2450LL,w+c[u])]=t+d[u];pq.push(tp(t+d[u],u,min(2450LL,w+c[u])));//存入状态}//这里只充一次钱,因为接下来会有下一次充钱的状态到来~}for(int i=2;i<=n;i++){ll ans=inf;for(int j=0;j<=2450;j++)ans=min(ans,dp[i][j]);//取到达时剩下的不同钱中最快的printf("%lld\n",ans);}
}

[ACM]【Dijkstra/DP】Atcoder 164 Two Currencies相关推荐

  1. 【概率DP】$P2059$ 卡牌游戏

    [概率DP]P2059 卡牌游戏 链接 题目描述 N个人坐成一圈玩游戏.一开始我们把所有玩家按顺时针从1到N编号.首先第一回合是玩家1作为庄家.每个回合庄家都会随机(即按相等的概率)从卡牌堆里选择一张 ...

  2. 【数位DP】恨7不成妻

    [数位DP]恨7不成妻 时间限制: 1 Sec  内存限制: 128 MB 提交: 8  解决: 4 [提交] [状态] [命题人:admin] 题目描述 单身! 依然单身! 吉哥依然单身! DS级码 ...

  3. Bailian4004 数字组合【递归+DP】

    4004:数字组合 总时间限制: 1000ms 内存限制: 65536kB 描述 有n个正整数,找出其中和为t(t也是正整数)的可能的组合方式.如: n=5,5个数分别为1,2,3,4,5,t=5: ...

  4. UVA497 Strategic Defense Initiative【LIS+DP】

    "Commander! Commander! Please wake up commander!"     "- mmmph. What time is it?" ...

  5. Bailian2755 神奇的口袋【递归+DP】

    2755:神奇的口袋 总时间限制: 10000ms 内存限制: 65536kB 描述 有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40.John现在有n个想要得 ...

  6. poj1161Post Office【经典dp】

    题目:poj1161Post Office点击打开链接 题意:给出一条直线上的n个坐标表示村庄的位置,然后要在上面建p个邮局.村民优先选择去近的邮局.问全部村庄去邮局的最小距离和是多少? 分类:区间d ...

  7. 【背包DP】【2018.9.20普及组模拟】T3(WOJ 3975)保护羊村

    题目(保护羊村): [题目描述] 伟大的Yyz 帮助羊羊们逃出了城堡,可Jack 自然不会善罢甘休."我会诅咒你们的!"杰杰恼羞成怒地喊道.回到羊村后,羊羊们发现羊村地震了.看来J ...

  8. 【线性DP】跳格子问题 + 光签题(取石子游戏)

    Part1跳格子Part\ 1\ 跳格子Part 1 跳格子 LDUOJ 测试平台传送门 问题描述: NikolaNikolaNikola 现在已经成为一个游戏里的重要人物.这个游戏是由一行 NNN ...

  9. 【动态规划dp】青蛙的烦恼(frog)

    青蛙的烦恼(frog) [题目描述] 池塘中有 n 片荷叶恰好围成了一个凸多边形,有一只小青蛙恰好站在 1 号荷叶上,小青蛙想通过 最短的路程遍历所有的荷叶(经过一个荷叶一次且仅一次),小青蛙可以从一 ...

  10. 【搜索+DP】codevs1066-引水入城

    [题目大意] 一个N行M列的矩形,如上图所示,其中每个格子都代表一座城 市,每座城市都有一个海拔高度.现在要在某些城市建造水利设施.水利设施有两种,分别为蓄水厂和输水站.蓄水厂的功能是利用水泵将湖泊中 ...

最新文章

  1. php psr2规范,PhpStorm集成PSR2代码自动检查 | 吴文辉博客
  2. 用好ASP.NET 2.0的URL映射
  3. 42张图详解 NAT : 换个马甲就能上网
  4. html基础1-基本语法/段落标签/特殊符号
  5. RSA算法原理——(3)RSA加解密过程及公式论证
  6. oracle获取下级函数,从oracle获取函数和过程签名列表
  7. iOS GoldRaccoon第三方FTP文件夹下载失败原因
  8. std::bind 详解及参数解析
  9. javafx有布局管理器吗_JavaFX技巧17:带有AnchorPane的动画工作台布局
  10. php addall,深入解析thinkphp中的addAll方法
  11. .NET控件Designer架构设“.NET研究”计
  12. MongnDB 主从复制
  13. 小米架构调整:将销售与服务部改组为中国区 王川任总裁
  14. 图像识别从零写出dnf脚本关键要点
  15. 在WPS绿色版中增加自定义皮肤
  16. Windows下进行域名映射并配置Nginx反向代理
  17. 迅捷路由连接服务器未响应,fast迅捷路由器设置:连上无线信号上不了网,怎么办?...
  18. C#之 正则表达式和特殊字符
  19. linux中pe中文名称,原来如此,Linux系统也有PE,不过它叫...
  20. 架构设计软件EA使用指南

热门文章

  1. 【江枫】用Perl的hash数组实现个性化监控
  2. 京东 Android 客户端样式的级联地址选择器
  3. BeagleBone Black 从零到一 (2 MLO、U-Boot) 转
  4. vue2.0 仿蘑菇街
  5. 如何自定义 conventional-changelog
  6. Conventional-path insert(传统路径插入)
  7. 互不联网“拆墙”之后的新私域红利——许远东在第63届直播新零售千人峰会发言
  8. DOS和Debug常用命令
  9. FreeRTOS 任务调度 系统节拍
  10. 永磁同步电机的矢量控制策略(八)一一一仿真模型搭建与源代码