博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
昂贵的聘礼 POJ - 1062
阅读量:6280 次
发布时间:2019-06-22

本文共 2792 字,大约阅读时间需要 9 分钟。

昂贵的聘礼 

2018-03-14 14:06:05

题意:小花想娶部落里的王子 王子的父亲要求一定数量的金币  困窘的小花还有两外一条出路就是得到另外一件东西与王子的父亲交换 以此来减少金币  同理 可以由别的东西来换取现在需要的东西的优惠 另一个限制条件就是 等级相差k的人不能进行交易 即使是间接交易

思路:建造一棵树 两个节点之间的边权即代表由B事物去换取A事物还需要多少金币  节点用结构体保存 表示这个物品的价格与等级  这样的话 要得到一号节点的王子 就是不断向下搜索 在可以走的条件下(等级限制) 找到尽可能短的路到达一号节点  每一条路径都需要加上末尾节点的值 因为获得最后面的物品也是需要花钱的

现在附上错误代码 错误代码是按照BFS搜下去 dis[]数组保存的是到达一号节点的距离 然后最后吧所有的节点跑一边 找到最小的dis[]+node[i].mon就好

错因:我这里的等级限制是由1号节点得来 然后一直使用的 但是在加入一个新的节点到路径上来的时候 后面的节点的等级限制就发生了改变 例如 1号节点的等级是3 k=1 那么等级限制就是2~4 下一个节点的等级是2 满足要求 但是后面路径上的点的等级限制就变成了2~3

#include
#include
#include
#include
using namespace std;#define inf 0x3f3f3f3fint k , n;struct NODE{ int mon; int dep;}node[110];int mp[110][110];//记录图int dis[110];//记录1号点到其他点的距离int vis[110];//是否被加入到最短路中void init(){ for(int i=1; i<=n; i++) { dis[i] = inf; for(int j=1; j<=n; j++) { mp[i][j] = inf; } } memset(vis , 0 , sizeof(vis));}void input(){ int num; int id , val; for(int i=1; i<=n; i++) { scanf("%d%d%d" , &node[i].mon , &node[i].dep , &num); for(int j=1; j<=num; j++) { scanf("%d%d" , &id , &val); mp[i][id] = val; } }}void solve(){ int l , r; int f; l = max(0 , node[1].dep-k); r = node[1].dep+k; dis[1] = 0; while( true ) {// printf("+++++++++++\n"); int minn = inf; int whe = -1; for(int i=1; i<=n; i++) { if(vis[i]==0 && node[i].dep>=l && node[i].dep<=r && dis[i]

正确代码

使用DFS来写 每一条路径上不停地更新等级限制

///错因  没有更新限制的等级的上下界///此时不能用广搜了 这个想法是不对的 应该用深搜 不断更新上下界#include
#include
#include
#include
using namespace std;#define inf 1000000000int k , n;struct NODE{ int mon; int dep;} node[110];int mp[110][110];//记录图int dis[110];//记录1号点到其他点的距离int vis[110];//是否被加入到最短路中int ans;int l , r;void init(){ for(int i=1; i<=n; i++) { dis[i] = inf; for(int j=1; j<=n; j++) { mp[i][j] = inf; } } memset(vis , 0 , sizeof(vis));}void input(){ int num; int id , val; for(int i=1; i<=n; i++) { scanf("%d%d%d" , &node[i].mon , &node[i].dep , &num); for(int j=1; j<=num; j++) { scanf("%d%d" , &id , &val); mp[i][id] = val; } }}void dfs(int num){ int tmp1 , tmp2; for(int i=1; i<=n; i++) { if(vis[i]==0 && node[i].dep>=l && node[i].dep<=r) { if((num==1&&mp[1][i]
=l && node[i].dep<=r && dis[i]
=l && node[i].dep<=r)// {// dis[i] = mp[1][i];// }// } dfs(1); printf("%d\n", ans);// ans(); } return 0;}

 

转载于:https://www.cnblogs.com/Flower-Z/p/8567275.html

你可能感兴趣的文章
Web基础架构:负载均衡和LVS
查看>>
Linux下c/c++相对路径动态库的生成与使用
查看>>
SHELL实现跳板机,只允许用户执行少量允许的命令
查看>>
SpringBoot 整合Redis
查看>>
2014上半年大片早知道
查看>>
Android 6.0指纹识别App开发案例
查看>>
正文提取算法
查看>>
轻松学PHP
查看>>
Linux中的网络监控命令
查看>>
this的用法
查看>>
windows下安装redis
查看>>
CentOS7 yum 安装git
查看>>
启动日志中频繁出现以下信息
查看>>
httpd – 对Apache的DFOREGROUND感到困惑
查看>>
分布式锁的一点理解
查看>>
idea的maven项目,install下载重复下载本地库中已有的jar包,而且下载后jar包都是lastupdated问题...
查看>>
2019测试指南-web应用程序安全测试(二)指纹Web服务器
查看>>
树莓派3链接wifi
查看>>
js面向对象编程
查看>>
Ruby中类 模块 单例方法 总结
查看>>