倒水问题 (FillUVa 10603) 隐式图
2024-10-20 10:41:09
题意:本题的题意是给你三个杯子,第一二个杯子是空的,第三个杯子装满水,要求是量出一定容量d升的水。若是得不到d升的水,那就让某一个杯子里面的水达到d‘,使得d'尽量接近d升。
解题思路:本题是给出初始状态,让你寻找一条通往目标的路径,此题也可看成是有向图中在起点和目标点之间寻找一条最短路径,但是这个最短路径不是距离最短而是倒的水最少,所以这题类似于Dijkstra算法求最短路,利用广搜,一直选当前水量最少的结点进行扩展,所以可以建立一个优先队列来存储下一次要访问的结点,同时将访问过的结点标记一下,大大节省了访问时间,此题的结点数最多为201^2.
代码:
#include<stdio.h>
#include<math.h>
#include<queue>
#include<string.h>
#include<iostream>
using namespace std;
const int maxn=;
int n;
int visit[maxn][maxn],cap[],ans[maxn];
//三个数组分别表示标记是否访问过这种情况,三个容器的大小,以及得到对应的水需要倒水的体积 struct Node{
int v[],dist;
const bool operator < (Node s) const{ //优先队列重载运算符
return dist>s.dist;
}
}; void update(Node t){ //更新倒水数
for(int i=;i<;i++){
int s=t.v[i];
if(ans[s]< || t.dist<ans[s]){
ans[s]=t.dist;
}
}
} void traver(int a,int b,int c,int d){ //遍历函数
priority_queue<Node> q;
memset(visit,,sizeof(visit));
memset(ans,-,sizeof(ans));
cap[]=a;
cap[]=b;
cap[]=c;
Node s;
s.v[]=;
s.v[]=;
s.v[]=c;
s.dist=;
q.push(s);
visit[][]=;
while(!q.empty()){
Node t=q.top();
q.pop();
update(t);
if(ans[d]>=) break;
for(int i=;i<;i++){//访问下一个结点,表示将水从i杯倒到j杯
for(int j=;j<;j++){
if(i!=j){
if(t.v[i]==||t.v[j]==cap[j]) continue;
Node k;
int water=min(t.v[i],cap[j]-t.v[j]);
k.dist=t.dist+water;
k.v[i]=t.v[i]-water;
k.v[j]=t.v[j]+water;
k.v[-i-j]=t.v[-i-j]; //如果不是讲原结点复制过来的,记得给此结点赋值
if(!visit[k.v[]][k.v[]]){
visit[k.v[]][k.v[]]=;
q.push(k);
}
}
}
}
}
for(;d>=;d--){ //输出
if(ans[d]>=){
printf("%d %d\n",ans[d],d);
break;
}
}
} int main(){
freopen("in.txt","r",stdin);
scanf("%d",&n);
while(n--){
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
traver(a,b,c,d);
}
return ;
}
最新文章
- rem单位和em单位的使用
- HDMI IP学习笔记
- PHP运算符:算数运算符、逻辑运算符、三目运算符、位运算符、字符串运算符。
- java的读文件操作
- 12月2日,上海Cloud Foundry Summit, Azure Cloud Foundry 团队期待和你见面!
- WiFi Test Entity
- JQuery Basic Features Quick Walkthrough
- Android直接通过ip进行Http请求
- win7远程工具mstsc.exe
- mysql 存储过程的应用
- hibernate sql查询转换成VO返回list
- phpstorm ftp主动模式能连接上,但获取不到目录;
- 如何备份和恢复你的TFS服务器(三)
- 论文笔记:Rich feature hierarchies for accurate object detection and semantic segmentation
- 【中间件安全】WebSphere安全加固规范
- Nest.js 处理错误
- 微信小程序navigator
- [Laravel] 11 - WEB API : cache &; timer
- linux命令学习(3):ls命令
- SSL、TLS中间人攻击
热门文章
- 1034: [ZJOI2008]泡泡堂BNB
- SSH框架的多表查询和增删查改 (方法一)上
- 使用(Unicode字符)让inline水平元素换行
- EasyWcf------无需配置,无需引用,动态绑定,轻松使用
- 10.javaweb核心标签库详解
- Java中Httpsession是如何实现的?
- Android开发之漫漫长途 Ⅴ——Activity的显示之ViewRootImpl的PreMeasure、WindowLayout、EndMeasure、Layout、Draw
- 使用c#操作txt
- c#关键字及ref和out
- Maven 整合 SSH 框架