poj1062 昂贵的聘礼 (DFS)

2024-02-09 16:18
文章标签 dfs 聘礼 昂贵 poj1062

本文主要是介绍poj1062 昂贵的聘礼 (DFS),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

A - 昂贵的聘礼
Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u
Submit Status Practice POJ 1062
Appoint description:

Description

年轻的探险家来到了一个印第安部落里。在那里他和酋长的女儿相爱了,于是便向酋长去求亲。酋长要他用10000个金币作为聘礼才答应把女儿嫁给他。探险家拿不出这么多金币,便请求酋长降低要求。酋长说:"嗯,如果你能够替我弄到大祭司的皮袄,我可以只要8000金币。如果你能够弄来他的水晶球,那么只要5000金币就行了。"探险家就跑到大祭司那里,向他要求皮袄或水晶球,大祭司要他用金币来换,或者替他弄来其他的东西,他可以降低价格。探险家于是又跑到其他地方,其他人也提出了类似的要求,或者直接用金币换,或者找到其他东西就可以降低价格。不过探险家没必要用多样东西去换一样东西,因为不会得到更低的价格。探险家现在很需要你的帮忙,让他用最少的金币娶到自己的心上人。另外他要告诉你的是,在这个部落里,等级观念十分森严。地位差距超过一定限制的两个人之间不会进行任何形式的直接接触,包括交易。他是一个外来人,所以可以不受这些限制。但是如果他和某个地位较低的人进行了交易,地位较高的的人不会再和他交易,他们认为这样等于是间接接触,反过来也一样。因此你需要在考虑所有的情况以后给他提供一个最好的方案。
为了方便起见,我们把所有的物品从1开始进行编号,酋长的允诺也看作一个物品,并且编号总是1。每个物品都有对应的价格P,主人的地位等级L,以及一系列的替代品Ti和该替代品所对应的"优惠"Vi。如果两人地位等级差距超过了M,就不能"间接交易"。你必须根据这些数据来计算出探险家最少需要多少金币才能娶到酋长的女儿。

Input

输入第一行是两个整数M,N(1 <= N <= 100),依次表示地位等级差距限制和物品的总数。接下来按照编号从小到大依次给出了N个物品的描述。每个物品的描述开头是三个非负整数P、L、X(X < N),依次表示该物品的价格、主人的地位等级和替代品总数。接下来X行每行包括两个整数T和V,分别表示替代品的编号和"优惠价格"。

Output

输出最少需要的金币数。

Sample Input

1 4
10000 3 2
2 8000
3 5000
1000 2 1
4 200
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <string.h>
#include <math.h>
using namespace std;
struct node
{int price,level;
}c[105];
struct node1
{int num,discount;
};
vector<node1>edge[105];
int n,m,result;
bool vis[105];
int dfs(int x,int sum,int max_level,int min_level)
{result=min(result,sum);max_level=max(max_level,c[x].level);min_level=min(min_level,c[x].level);for(int i=0;i<edge[x].size();i++){node1 temp=edge[x][i];if(fabs(min_level-c[temp.num].level)<=m&&fabs(max_level-c[temp.num].level)<=m&&!vis[temp.num]){vis[temp.num]=true;dfs(temp.num,sum+temp.discount+c[temp.num].price-c[x].price,max(max_level,c[x].level),min(min_level,c[x].level));vis[temp.num]=false;}}
}
int main()
{while(~scanf("%d %d",&m,&n)){memset(vis,false,sizeof(vis));memset(edge,0,sizeof(edge));memset(&c,0,sizeof(&c));for(int i=1;i<=n;i++){int x;scanf("%d %d %d",&c[i].price,&c[i].level,&x);for(int j=0;j<x;j++){node1 temp;scanf("%d %d",&temp.num,&temp.discount);edge[i].push_back(temp);}}result=c[1].price;vis[1]=true;dfs(1,c[1].price,c[1].level,c[1].level);printf("%d\n",result);}return 0;
}

3000 2 14 20050 2 0

Sample Output

5250

虽然不知道深搜为什么能过   看到评论区说是数据太弱了。。

大家都是用的dijkstra算法。。。好吧

还有这道题的一个难于理解的地方  也是我犯错的地方  就是这句话 “如果两人地位等级差距超过了M,就不能"间接交易"。

我理解为在两个人交易时 如果两个人的等级差超过M就不能交易 谁知道是所有的交易成员之间都不能超过M。。。。

dfs ac代码:


这篇关于poj1062 昂贵的聘礼 (DFS)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/694707

相关文章

poj 1564 Sum It Up -- DFS 递归

题意:给一个数 t ,以及 n 个数,求 n 个数中的几个数加起来的和为 t 的情况有多少种。 注意:题目要求相同的组合方式不能出现2次,即 “3 4 1 1 1 1 ” 的结果为:“1+1+1”。 思路:一个  for  循环遍历一遍,每个 i 表示以当前数为起点开始一次DFS递归,当所遍历的和为 t 时,输出该组合方式,如果大于 t 则返回,小于则往下递归。以二维数组保存已经输出过的数据,

洛谷 P1141 01迷宫 (dfs解决)

题目描述 有一个仅由数字 0 与 1 组成的 n×n 格迷宫。若你位于一格 0 上,那么你可以移动到相邻 4 格中的某一格 1 上,同样若你位于一格 1 上,那么你可以移动到相邻 4 格中的某一格 0 上。 你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身)。 输入格式 第一行为两个正整数 𝑛,𝑚。 下面 𝑛 行,每行 𝑛 个字符,字符只可能是 0 或者

[HDU 4324] Triangle LOVE (拓扑排序,DFS)

HDU - 4324 题意是,一张有 N个点的图,保证每两个点之间有且只有一条有向边连接 求是否存在三元环 用拓扑排序判环,如果存在环,则一定存在三元环 证明如下: 不存在二元环 设存在 n(n>=3)元环 p1->p2->p3->…->pn->p1 1) 若存在边 p3->p1,则存在三元环 (p1->p2->p3->p1) 2) 若不存在 p3->p1,则必然存在 p1->p3

[CSU - 1811 (湖南省赛16)] Tree Intersection (dfs序维护子树+离线询问+树状数组)

CSU - 1811 (湖南省赛16) 给定一棵树,每个节点都有一个颜色 问割掉任意一条边,生成的两个子树中颜色集合的交集大小 这个是 dfs序处理子树 + 离线询问 + bit维护 的解法 首先问题转化为求解一个子树中有多少种颜色以及独有颜色的数量 用总的颜色数量减去独有颜色数量即为这棵子树的答案 先做一遍 dfs,再按 dfs序重新组建颜色序列 这样对子树的询问,就变成

DFS走迷宫(懒猫老师C++完整版)

DFS走迷宫的C++完整版 知识储备一:普通动态二维数组的构造二:栈的构造三:栈的逆序遍历 Main文件代码 该版本代码是配合 懒猫老师用DFS走迷宫视频 基于C++基础所写的完整版(实现了栈逆序遍历),适合小白系统性的学习和复习知识点,只要将下文.h和.cpp和main文件所展示的代码结合起来就是个完整的代码。 知识储备 一:普通动态二维数组的构造 二维数组中不同行的内

fast DFS 单机使用实例

fast DFS 单机使用实例 我在一台服务器上简单测试了fastdfs。client, tracker, storage server都是同一个物理服务器。   1. 编译fastdfs:   sles207:/opt/mars/FastDFS # ./make.sh   storage_service.o: In function `storage_service_init':/opt/ma

[深度优先搜索DFS]迷宫问题

描述 定义一个二维数组: int maze[5][5] = {0, 1, 0, 0, 0,0, 1, 0, 1, 0,0, 0, 0, 0, 0,0, 1, 1, 1, 0,0, 0, 0, 1, 0,}; 它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。 输入 一个5 × 5的二维数组,表示一个迷宫。数

【LeetCode】 Surrounded Regions (BFS DFS)

题目:Surrounded Regions 广搜和深搜都能解决,但是LeetCode上使用深搜时会栈溢出 DFS: <span style="font-size:18px;">/*LeetCode Surrounded Regions* 题目:给定一个字符数组,由'X'和'O'组成,找到所有被x包围的o并将其替换为x* 思路:只要替换被包围的o就行,如果有一个o是边界或者上下左右中有一个

HDU 1044 BFS+DFS

先BFS出每个点之间的最小距离 然后DFS最优值 #include "queue"#include "iostream"#include "algorithm"using namespace std;int dir[4][2]={1,0,-1,0,0,1,0,-1};struct node{int x,y,step;};struct comp{int x,y;} mar

DFS(一)

问题一(指数级选择) 从1~n这n个整数中任意选取多个,输出所有可能的选择方案。 首先想一下,在现实世界中,我们要如何解决这个问题。 应该是一个一个枚举,即每个数都可以有两个选择(选/不选)。共有种结果。 想一下,如何在“纸上”解决问题呢?不妨假设有3各数(分别为1、2、3)。 一共有3个位置,从第一个位置开始枚举选还是不选,这里只列出了一半。那么在编程语言上如何实现呢? 仔细想一