看着lrj的代码自己敲了一遍,还没调试成功。。。。

有时间再进行完善

 /*状态start到各个状态u1,u2,u3.....的倒水量分别为u1.dist,u2.dist,u3.dist....*//*按倒水量递增的顺序去寻找当前状态的v[0],v[1],v[2]是否为d但是程序实现的时候我们寻找目标水量是根据 ans[d]>0,而不是对每一个状态的v[]进行遍历为什么这样做呢?当然是因为麻烦,ans[d]>0很直接地说明了v[]有三者之一为d*/#include <cstdio>#include <cstring>#include <queue>using namespace std;struct Node{int v[3],dist;bool operator <(const Node &u) const{return dist >u.dist;}};const int maxn=200+5;int vis[maxn][maxn],cap[3],ans[maxn];//因为只有三只杯子,所以记录前两只杯子的状态即可void update_ans(const Node &u){for (int i=0;i<3;i++){int d=u.v[i];if(ans[d]<0||u.dist<ans[d]) ans[d]=u.dist;//每次有新的状态时,记录形成d升水所需要的最小倒水量}}void solve(int a,int b,int c,int d){cap[0]=a;cap[1]=b;cap[2]=c;memset(vis,0,sizeof(vis));//vis[]记录三元组状态是否重复memset(ans,-1,sizeof(ans));//ans[]记录当前的最小倒水量priority_queue<Node> q;Node start;start.dist=0;//总的倒水量start.v[0]=0;start.v[1]=0;start.v[2]=c;q.push(start);//准备工作vis[0][0]=1;//设置初始状态为已访问/*!当所有状态都被访问完,就算ans[d]<0,while{}也停止!!当ans[d]>0,表示输出所求的状态已找到,停止循环*/while (!q.empty()){Node u=q.top();q.pop();//对优先队列表头(即当前队列结点.dist最小)的结点进行访问update_ans(u);if (ans[d]>=0)  break;//从v[i]--v[j]加水,加多少水呢?只要能加,就加到不能加为止for(int i=0;i<3;i++)for(int j=0;j<3;j++)if(i!=j){if(u.v[i]==0||u.v[j]==cap[j]) continue; //过渡到下一个i或下一个jint amount=min(cap[j],u.v[i])-u.v[j];Node u2;memcpy(&u2,&u,sizeof(u));u2.dist=u.dist+amount;u2.v[i]-=amount;u2.v[j]+=amount;if (!vis[u2.v[0]][u2.v[1]]){vis[u2.v[0]][u2.v[1]]=1;q.push(u2);}}}while (d>=0){if(ans[d]>=0){printf("%d %d\n",ans[d],d);return;}d--;}}int main(){int T,a,b,c,d;scanf("d%",&T);while(T--){scanf("%d%d%d%d",&a,&b,&c,&d);solve(a,b,c,d);}return 0;}

  

转载于:https://www.cnblogs.com/mdz-great-world/p/6375437.html

倒水问题(Fill,UVA 10603) lrj白书 p202相关推荐

  1. LRJ白书图论 11324 - The Largest Clique uva

    /*题意:给一张有向图,求这样的一个点集,使得集合中的点u,v,u->v,or v->u,or,u<->v.对图缩点,构造一张DAG.在DAG上作dp最长路.点权为每个强连通分 ...

  2. J - Fill (UVA - 10603)

    - 题目大意 有三个已知体积但不知刻度的杯子,前两个杯子中初始时没有水,第三个装满水,问是否可以倒出d升水,如果倒不出,则倒出一个最大的d',使得d'<=d,并且在这个过程中要求总倒水量最少. ...

  3. 白书P61 - 点集配对问题

    白书P61 - 点集配对问题 状压DP #include <iostream> #include <cstdio> #include <cstring> using ...

  4. UVA - 10603 Fill(BFS求最小值问题)

    题目: 给出三个杯子(没有刻度线)的容量,起初之后第三个杯子是满的,其他的两个杯子是空的,容量分别是a.b.c.问最少需要倒多少升水才能让某一个杯子中的水有d升?如果不能恰好做到d升,就让某一个杯子里 ...

  5. UVA 10603 - Fill(dijkstra + 状态图)

    题目链接 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...

  6. UVa 10603 Fill (BFS+优先队列)

    题意:给定4个数,a,b,c,d,分别代表空杯子容积为a,b,一个盛满水的杯子容积为c,让你不断倒水,找一个dd,是不是存在某个时刻,某个杯子里的水dd,和d相同,或者无限接近.让求最少的倒水量和dd ...

  7. UVA - 10603 Fill(隐式图搜索)

    题目大意:经典的倒水问题. 给你三个瓶子,体积为a,b,c. 刚開始a,b是空的,c是满的,如今要求你到出体积为d的水.倒水的规则为,要么倒水方为空,要么接水方满 问倒到容量为d时,倒水的最小体积是多 ...

  8. UVA 10603 Fill

    这道题其实是个隐形图(bfs),由开始状态往后面推就行了 #include<iostream> #include<cstdio> #include<algorithm&g ...

  9. UVA 116 Unidirectional TSP (白书dp)

    http://acm.hust.edu.cn:8080/judge/problem/viewProblem.action?id=18206 1 /* 2 题目大意: 3 从第一列的任意一格出发,到子最 ...

最新文章

  1. c/c++中的函数指针和指针函数
  2. 【sox】使用sox增加混响效果
  3. google python代码规范_如何用好python编码规范,写一手漂亮的代码
  4. 在Linux中搭建一个FTP服务器
  5. [转]tesseract OCR Engine overview字符识别学习
  6. 备战秋招——操作系统
  7. 小程序外接web-view坑------alert显示域名
  8. ? SegmentFault Hackathon 文艺复兴上海站作品集 - 获奖篇
  9. 标准评分卡分数计算原理_评分卡的形式、刻度及应用场景
  10. 无法删除文件提示找不到指定文件导致文件无法删除的解决方法
  11. erlang的简单模拟半包的产生
  12. BZOJ 4043 [HAOI2015]树上操作 dfs序 线段树
  13. 液晶手写板原理拆解_汽车抬头显示HUD的拆解
  14. SQL事务与ADO.NET事务
  15. @Transactional(rollbackFor=Exception.class)的作用
  16. 思维导图——线性代数知识点总结
  17. 计算机组装维修设置还原点,电脑组装、维护与故障排除
  18. Java生鲜电商平台-会员积分系统的设计与架构
  19. linux 编译chromium,chromium(linux环境)指定版本下载和编译教程
  20. 微信 小程序 APP 渗透测试方案

热门文章

  1. python进阶-面向对象编程四:包装授权和自定制列表某些方法
  2. Qt on Android:将Qt调试信息输出到logcat中
  3. 1021. Deepest Root (25)
  4. PHP经验总结 - 开发技巧分享
  5. Exchange2007 申请安装证书
  6. 交换机的基本功能和应用就是集中连接网络设备
  7. JMeter性能测试入门
  8. Mozilla官方:Firefox 3.5.1问题并非安全漏洞 仅是堆溢出Crash
  9. 新课改实践下美术课程的新教学观
  10. 配置windows 2008 作为远程访问SSL-×××服务器系列之二