昂贵的聘礼
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 44870   Accepted: 13259

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. 1 4
  2. 10000 3 2
  3. 2 8000
  4. 3 5000
  5. 1000 2 1
  6. 4 200
  7. 3000 2 1
  8. 4 200
  9. 50 2 0

Sample Output

  1. 5250

Source

 
题解:DFS,一定是单向边....维护最大和最小两个等级参数,然后搜索时维护这两个等级参数,,如果某个点的level与最大或最小相差大于 m 就是肯定不行的。。然后即时更新min,max
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <queue>
  5. #include <algorithm>
  6. #include <math.h>
  7. using namespace std;
  8. typedef long long LL;
  9. const int INF = ;
  10. const int N = ;
  11. int m,n;
  12. int MIN;
  13. int graph[N][N];
  14. struct Node{
  15. int v,level;
  16. }node[];
  17. bool vis[N];
  18.  
  19. void dfs(int u,int ans,int level1,int level2){
  20. vis[u] = true;
  21. MIN = min(ans+node[u].v,MIN);
  22. for(int i=;i<=n;i++){
  23. if(!vis[i]&&graph[u][i]<INF){
  24. if(abs(node[i].level-level1)>m) continue;
  25. if(abs(node[i].level-level2)>m) continue;
  26. dfs(i,ans+graph[u][i],min(node[i].level,level1),max(level2,node[i].level));
  27. vis[i] = false;
  28. }
  29. }
  30. }
  31. int main()
  32. {
  33. while(scanf("%d%d",&m,&n)!=EOF){
  34. for(int i=;i<=n;i++){
  35. for(int j=;j<=n;j++){
  36. graph[i][j] = INF;
  37. if(i==j) graph[i][j] = ;
  38. }
  39. }
  40. int LEVEL;
  41. for(int i=;i<=n;i++){
  42. int num;
  43. scanf("%d%d%d",&node[i].v,&node[i].level,&num);
  44. for(int j=;j<=num;j++){
  45. int a,b;
  46. scanf("%d%d",&a,&b);
  47. graph[i][a] = min(b,graph[i][a]);
  48. }
  49. }
  50. LEVEL = node[].level;
  51. memset(vis,,sizeof(vis));
  52. MIN = ;
  53. dfs(,,LEVEL,LEVEL);
  54. printf("%d\n",MIN);
  55. }
  56. return ;
  57. }

还有一种方法就是枚举每一个点作为最大level进行dijkstra.

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <queue>
  5. #include <algorithm>
  6. #include <math.h>
  7. using namespace std;
  8. typedef long long LL;
  9. const int INF = ;
  10. const int N = ;
  11. int m,n;
  12. int MIN;
  13. int graph[N][N];
  14. struct Node{
  15. int v,level;
  16. }node[];
  17. bool vis[N];
  18. int low[N];
  19. int dijkstra(){
  20. int pos=;
  21. for(int i=;i<=n;i++){
  22. low[i] = node[i].v;
  23. }
  24. for(int i=;i<n;i++){
  25. int MIN = INF;
  26. for(int j=;j<=n;j++){
  27. if(!vis[j]&&MIN>low[j]){
  28. pos = j;
  29. MIN = low[j];
  30. }
  31. }
  32. vis[pos] = true;
  33. for(int j=;j<=n;j++){
  34. if(!vis[j]&&low[j]>low[pos]+graph[pos][j]){
  35. low[j] = low[pos]+graph[pos][j];
  36. }
  37. }
  38. }
  39. return low[];
  40. }
  41. int main()
  42. {
  43. while(scanf("%d%d",&m,&n)!=EOF){
  44. for(int i=;i<=n;i++){
  45. for(int j=;j<=n;j++){
  46. graph[i][j] = INF;
  47. if(i==j) graph[i][j] = ;
  48. }
  49. }
  50. for(int i=;i<=n;i++){
  51. int num;
  52. scanf("%d%d%d",&node[i].v,&node[i].level,&num);
  53. graph[][i] = node[i].v;
  54. for(int j=;j<=num;j++){
  55. int a,b;
  56. scanf("%d%d",&a,&b);
  57. graph[a][i] = min(b,graph[a][i]);
  58. }
  59. }
  60. int LEVEL;
  61. MIN = INF;
  62. for(int i=;i<=n;i++){
  63. LEVEL = node[i].level;///设当前值的level 最大
  64. memset(vis,,sizeof(vis));
  65. for(int j=;j<=n;j++){
  66. if(node[j].level>LEVEL||LEVEL-node[j].level>m) vis[j] = true;
  67. }
  68. MIN = min(MIN,dijkstra());
  69. }
  70. printf("%d\n",MIN);
  71. }
  72. return ;
  73. }

hdu 1062(DFS||dijkstra)的更多相关文章

  1. HDU 5143 DFS

    分别给出1,2,3,4   a, b, c,d个 问能否组成数个长度不小于3的等差数列. 首先数量存在大于3的可以直接拿掉,那么可以先判是否都是0或大于3的 然后直接DFS就行了,但是还是要注意先判合 ...

  2. Snacks HDU 5692 dfs序列+线段树

    Snacks HDU 5692 dfs序列+线段树 题意 百度科技园内有n个零食机,零食机之间通过n−1条路相互连通.每个零食机都有一个值v,表示为小度熊提供零食的价值. 由于零食被频繁的消耗和补充, ...

  3. hdu 1142(DFS+dijkstra)

    #include<iostream> #include<cstdio> #include<cmath> #include<map> #include&l ...

  4. ACM: HDU 1869 六度分离-Dijkstra算法

    HDU 1869六度分离 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Descri ...

  5. HDU 5877 dfs+ 线段树(或+树状树组)

    1.HDU 5877  Weak Pair 2.总结:有多种做法,这里写了dfs+线段树(或+树状树组),还可用主席树或平衡树,但还不会这两个 3.思路:利用dfs遍历子节点,同时对于每个子节点au, ...

  6. HDU 1062 Text Reverse(水题,字符串处理)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1062 解题报告:注意一行的末尾可能是空格,还有记得getchar()吃回车符. #include< ...

  7. hdu 4751(dfs染色)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4751 思路:构建新图,对于那些两点连双向边的,忽略,然后其余的都连双向边,于是在新图中,连边的点是能不 ...

  8. HDU 1045 (DFS搜索)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1045 题目大意:在不是X的地方放O,所有O在没有隔板情况下不能对视(横行和数列),问最多可以放多少个 ...

  9. HDU 1241 (DFS搜索+染色)

    题目链接:  http://acm.hdu.edu.cn/showproblem.php?pid=1241 题目大意:求一张地图里的连通块.注意可以斜着连通. 解题思路: 八个方向dfs一遍,一边df ...

随机推荐

  1. 《Hadoop基础教程》之初识Hadoop(转载)

    转载自博主:上善若水任方圆http://blessht.iteye.com/blog/2095675 Hadoop一直是我想学习的技术,正巧最近项目组要做电子商城,我就开始研究Hadoop,虽然最后鉴 ...

  2. [Elasticsearch] 多字段搜索 (二) - 最佳字段查询及其调优

    最佳字段(Best Fields) 假设我们有一个让用户搜索博客文章的网站,就像这两份文档一样: PUT /my_index/my_type/1 { "title": " ...

  3. Android 多屏幕适配 dp和px的关系

    一直以来别人经常问我,android的多屏幕适配到底是怎么弄,我也不知道如何讲解清楚,或许自己也是挺迷糊. 以下得出的结论主要是结合官方文档进行分析的https://developer.android ...

  4. 批处理之FOR命令

  5. LinuxUnix time时间戳的处理转换函数

    Linux/Unix time时间戳的处理转换函数 linux下的时间函数 我们在编程中可能会经常用到时间,比如取得系统的时间(获取系统的年.月.日.时.分.秒,星期等),或者是隔一段时间去做某事,那 ...

  6. clear:both其实是有瑕疵的

    在开发中,从美工MM给你Html代码中,肯定能经常看"<div style="clear:both;"></div>"这样的代码,但是你 ...

  7. Mysql History list length 值太大引起的问题

    1. 环境 Mysql 主从 Mysql版本:5.1.49-log 系统:Red Hat Enterprise Linux Server release 5.4  64bit 2. 表面现象 数据库操 ...

  8. init_connect基本用法

    服务器为每个连接的客户端执行的字符串.字符串由一个或多个SQL语句组成.要想指定多个语句,用分号间隔开.例如,每个客户端开始时默认启用autocommit模式.没有全局服务器变量可以规定autocom ...

  9. missing blocks错误

    Datanode的日志中看到: 10/12/14 20:10:31 INFO hdfs.DFSClient: Could not obtain block blk_XXXXXXXXXXXXXXXXXX ...

  10. CMDB资产管理系统开发【day26】:02-数据写入待存区

    一.资产自动回报数据及个更新流程图 二.表结构注释(NewAssetApprovalZone) class NewAssetApprovalZone(models.Model): "&quo ...