AtCoder Beginner Contest 164 E Two Currencies Bellman-Ford优化思想+01背包+动归dp状态转移
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状态转移相关推荐
- AtCoder Beginner Contest 202 D - aab aba baa(组合计数,字典序)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Problem 有 AAA 和 aaa,BBB 个 bbb ,可以使用这 A+BA+BA+B 个字符任 ...
- AtCoder Beginner Contest 197 题解(A ~ F)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A - Rotate B - Visibility C - ORXOR D - Opposite ...
- AtCoder Beginner Contest 198 (A ~ F)题解
目录 A. Div B. Palindrome with leading zeros C. Compass Walking D. Send More Money E. Unique Color F. ...
- AtCoder Beginner Contest 215 G - Colorful Candies 2
AtCoder Beginner Contest 215 G - Colorful Candies 2 有n个糖果,每个糖果有着一个颜色a[i],每次拿k个糖果期望拿到E(x)个不同颜色的糖果,求出k ...
- 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 ...
- AtCoder Beginner Contest 215 E - Chain Contestant
AtCoder Beginner Contest 215 E - Chain Contestant 给出一个只包括A~J的字符串,定义一种子序列为:在这个子序列中,相同的字符必定连续出现,求出这样的子 ...
- AtCoder Beginner Contest 204 F Hanjo 2
AtCoder Beginner Contest 204 F Hanjo 2 H宽,W长的二维平面上,用1 * 1或者2 * 1的地砖来铺,要求铺满,求出方案数. 数据范围H <= 6, W & ...
- Caddi Programming Contest 2021(AtCoder Beginner Contest 193) 题解
Caddi Programming Contest 2021(AtCoder Beginner Contest 193) A - Discount 打折浮点数除即可 B - Play Snuke 枚举 ...
- Mynavi Programming Contest 2021(AtCoder Beginner Contest 201)题解
文章目录 A - Tiny Arithmetic Sequence B - Do you know the second highest mountain? C - Secret Number D - ...
- 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 ...
最新文章
- HDU多校5 - 6816 Boring Game(模拟)
- 2000年不算在21世纪
- zynq linux网口不通,已解决: ZYNQ 7035以太网口无法连通 - Community Forums
- linux emacs 编译,linux 编译安装emacs和安装spacemacs
- android 8 wifi 不稳定,Android 8.0又背锅?网络兼容问题导致WiFi狂掉线
- 让服务器自动从HG版本库中下载代码
- 马云:员工表现不好,老板要先检讨
- vivi开发笔记【专辑】
- BZOJ1036[ZJOI2008] 树的统计
- java velocity 语法_Velocity语法
- 宏杉MacroSAN MS3000G2 SPC-1测试性价比第一
- 苹果电脑(Mac)如何进行大小写和中英文的切换
- Matlab中单元数组和结构数组
- 机器人领域的会议和期刊【补充】
- 信息安全技术——(十五)物联网关键技术
- python面向对象oo是什么意思_python进阶:面向对象是什么意思?
- seo网站关键词优化三大要素:技术 思路 执行力
- 关于软件工程中的银弹
- 交大『云观CD-ROMIII』直接由CD-ROM执行之安装法(转)
- css 图片变大缩小,css3实现图片的变大变小
热门文章
- 巴西游戏出海攻略,优质游戏出海市场
- 《路由器开发 - 路由器刷机指南》华硕路由器RT-N66W刷机
- Privacy Policy of Clone App
- 线程基础 第一篇:线程的定义、状态、属性、简单实现线程
- excel 画图_Excel做数据分析?看这篇就够了!
- 《Loy解说Eureka服务端源码(一)》
- 同事把实数作为 HashMap 的key,领导心态崩了
- python求矩阵逆、伪逆、转置、矩阵乘法
- linux编辑文本(vim)时跳转到最后一行和第一行及相关指令 CentOS------编辑、修改文件命令
- linux删除文件子最后两行,关于linux:如何使用sed删除文件的最后n行