AtCoder Beginner Contest 164   比赛人数11302  比赛开始后15分钟看到所有题

AtCoder Beginner Contest 164  E  Two Currencies   Bellman-Ford优化思想+01背包+动归dp状态转移

总目录详见https://blog.csdn.net/mrcrack/article/details/104454762

在线测评地址https://atcoder.jp/contests/abc164/tasks/abc164_e

考察最短路,但换钱是个难题,会改变最短路径,在何处换钱,请注意,换钱很可能会改变路径走向。

dp[i][j]=k表示从节点1出发到达节点i,此时手头有j块银币,对应的最小消耗时间k,

三种状态(节点,银币数量,消耗时间),就用一个二维数组dp[][]给表示了.
Bellman-Ford算法分三种:Bellman-Ford算法,Bellman-Ford优化,Bellman-Ford队列优化(即SPFA算法)

因该题状态较多,若采用SPFA算法,可能会造成预先开的队列数组空间过大,超出内存限制,

故退一步,采用了Bellman-Ford优化。

看懂下面代码,读者需具备最短路算法,01背包算法。

基本思想:先有钱,再旅行,之后计算一无所有(手头0块银币)的最小消耗时间.

#include <cstdio>
#include <algorithm>
#define LL long long
#define M 3000
#define INF 1e15
//1e15由来:换钱耗时+旅行耗时=(D*A*N)+(B*N)50*=10^9*50*50+10^9*50
using namespace std;
//3010由来,旅行最多经过N个点(N-1条边),每条边最多花费50,故总花费50*50=2500,再大些,取3010
LL dp[55][3010];//换钱耗时+旅行耗时=(D*A*N)+(B*N)50*=10^9*50*50+10^9*50很明显int不够用
int c[55],d[55],head[55],tot;
struct node{int to,next,a,b;
}e[105*2];//无向图
void add_edge(int u,int v,int a,int b){//邻接表tot++,e[tot].to=v,e[tot].a=a,e[tot].b=b,e[tot].next=head[u],head[u]=tot;
}
int main(){int n,m,s,u,v,a,b,i,j,flag;scanf("%d%d%d",&n,&m,&s);for(i=1;i<=m;i++){scanf("%d%d%d%d",&u,&v,&a,&b);add_edge(u,v,a,b),add_edge(v,u,a,b);//无向图}for(i=1;i<=n;i++)scanf("%d%d",&c[i],&d[i]);for(i=1;i<=n;i++)for(j=0;j<=M;j++)//注意j从0开始,因最终目标是求dp[i][0],故j从0开始dp[i][j]=INF;s=min(s,M);//银币太多,无用dp[1][s]=0;//初始位置情况while(1){flag=0;for(u=1;u<=n;u++){//u所处节点for(j=0;j<=M;j++)//j手上银币数量if(j>=c[u]&&dp[u][j]>dp[u][j-c[u]]+d[u]) dp[u][j]=dp[u][j-c[u]]+d[u];//先换钱,01背包,j-c[u]能装进c[u]变成jfor(j=0;j<=M;j++)for(b=head[u];b;b=e[b].next){//再旅行v=e[b].to;if(j>=e[b].a&&dp[v][j-e[b].a]>dp[u][j]+e[b].b)//j消耗掉e[b].a,才能到j-e[b].a状态 v->u->1flag=1,dp[v][j-e[b].a]=dp[u][j]+e[b].b;//动归dp,状态转移}for(j=M-1;j>=0;j--)dp[u][j]=min(dp[u][j],dp[u][j+1]);//清空手头的银币,但不消耗时间}if(!flag)break;//Bellman-Ford优化}for(i=2;i<=n;i++)printf("%lld\n",dp[i][0]);return 0;
}

AtCoder Beginner Contest 164 E Two Currencies Bellman-Ford优化思想+01背包+动归dp状态转移相关推荐

  1. AtCoder Beginner Contest 202 D - aab aba baa(组合计数,字典序)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Problem 有 AAA 和 aaa,BBB 个 bbb ,可以使用这 A+BA+BA+B 个字符任 ...

  2. AtCoder Beginner Contest 197 题解(A ~ F)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A - Rotate B - Visibility C - ORXOR D - Opposite ...

  3. AtCoder Beginner Contest 198 (A ~ F)题解

    目录 A. Div B. Palindrome with leading zeros C. Compass Walking D. Send More Money E. Unique Color F. ...

  4. AtCoder Beginner Contest 215 G - Colorful Candies 2

    AtCoder Beginner Contest 215 G - Colorful Candies 2 有n个糖果,每个糖果有着一个颜色a[i],每次拿k个糖果期望拿到E(x)个不同颜色的糖果,求出k ...

  5. AtCoder Beginner Contest 215 F - Dist Max 2

    AtCoder Beginner Contest 215 F - Dist Max 2 平面上有一系列的点(xi,yi)(x_i,y_i)(xi​,yi​),定义两点(xi,yi),(xj,yj)(x ...

  6. AtCoder Beginner Contest 215 E - Chain Contestant

    AtCoder Beginner Contest 215 E - Chain Contestant 给出一个只包括A~J的字符串,定义一种子序列为:在这个子序列中,相同的字符必定连续出现,求出这样的子 ...

  7. AtCoder Beginner Contest 204 F Hanjo 2

    AtCoder Beginner Contest 204 F Hanjo 2 H宽,W长的二维平面上,用1 * 1或者2 * 1的地砖来铺,要求铺满,求出方案数. 数据范围H <= 6, W & ...

  8. Caddi Programming Contest 2021(AtCoder Beginner Contest 193) 题解

    Caddi Programming Contest 2021(AtCoder Beginner Contest 193) A - Discount 打折浮点数除即可 B - Play Snuke 枚举 ...

  9. Mynavi Programming Contest 2021(AtCoder Beginner Contest 201)题解

    文章目录 A - Tiny Arithmetic Sequence B - Do you know the second highest mountain? C - Secret Number D - ...

  10. KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200)题解

    文章目录 A - Century B - 200th ABC-200 C - Ringo's Favorite Numbers 2 D - Happy Birthday! 2 E - Patisser ...

最新文章

  1. HDU多校5 - 6816 Boring Game(模拟)
  2. 2000年不算在21世纪
  3. zynq linux网口不通,已解决: ZYNQ 7035以太网口无法连通 - Community Forums
  4. linux emacs 编译,linux 编译安装emacs和安装spacemacs
  5. android 8 wifi 不稳定,Android 8.0又背锅?网络兼容问题导致WiFi狂掉线
  6. 让服务器自动从HG版本库中下载代码
  7. 马云:员工表现不好,老板要先检讨
  8. vivi开发笔记【专辑】
  9. BZOJ1036[ZJOI2008] 树的统计
  10. java velocity 语法_Velocity语法
  11. 宏杉MacroSAN MS3000G2 SPC-1测试性价比第一
  12. 苹果电脑(Mac)如何进行大小写和中英文的切换
  13. Matlab中单元数组和结构数组
  14. 机器人领域的会议和期刊【补充】
  15. 信息安全技术——(十五)物联网关键技术
  16. python面向对象oo是什么意思_python进阶:面向对象是什么意思?
  17. seo网站关键词优化三大要素:技术 思路 执行力
  18. 关于软件工程中的银弹
  19. 交大『云观CD-ROMIII』直接由CD-ROM执行之安装法(转)
  20. css 图片变大缩小,css3实现图片的变大变小

热门文章

  1. 巴西游戏出海攻略,优质游戏出海市场
  2. 《路由器开发 - 路由器刷机指南》华硕路由器RT-N66W刷机
  3. Privacy Policy of Clone App
  4. 线程基础 第一篇:线程的定义、状态、属性、简单实现线程
  5. excel 画图_Excel做数据分析?看这篇就够了!
  6. 《Loy解说Eureka服务端源码(一)》
  7. 同事把实数作为 HashMap 的key,领导心态崩了
  8. python求矩阵逆、伪逆、转置、矩阵乘法
  9. linux编辑文本(vim)时跳转到最后一行和第一行及相关指令 CentOS------编辑、修改文件命令
  10. linux删除文件子最后两行,关于linux:如何使用sed删除文件的最后n行