开始的时候是暴力dfs+剪枝,怎么也不行。后来参考他人思想:

先求出每个点之间的最短路(这样预处理之后的搜索就可以判重返回了),截肢还是关键:1最优性剪枝(尽量最优:目前的状态+预计还有的最小时间>min就return !),2:可行性截肢:如果当前状态+预计状态已经不可行,return。(注意考虑是 continue,还是 return !).以及放的位置!在出口放的效果一般好一些(不在下次循环内部)(理由:若该状态是后面的状态进入的,前面的会dfs到很深,所以,放在最前面,一起判断下,不行就return 一般比较合理。)

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. using namespace std;
  5. int n;int da[35];int d[35];
  6. int a[35][35];
  7. int maxd=0;
  8. const int inf=0x3f3f3f3f;
  9. int minn=inf;
  10. int bit[31];
  11. void dfs(int x,int lev,int sum,int allstate)
  12. {
  13. if(sum+d[x]*(n-lev)>=minn||d[x]>maxd){return;}
  14. if(allstate==(bit[n]-1))
  15. {
  16. minn=sum;
  17. return;
  18. }
  19. for(int i=2;i<=n;i++)
  20. {
  21. if((allstate&bit[i-1])==0&&d[x]+a[x][i]>da[i])
  22. return;
  23. }
  24. for(int i=2;i<=n;i++)
  25. {
  26. if((allstate&bit[i-1])==0)
  27. {
  28. int f=d[i];
  29. d[i]=d[x]+a[x][i];
  30. dfs(i,lev+1,sum+d[i],allstate|bit[i-1]);
  31. d[i]=f;
  32. }
  33. }
  34. return ;
  35. }
  36. void init()
  37. {
  38. int td=0;
  39. da[1]=0x3f3f3f3f-1;
  40. for(int i=1;i<=n;i++)
  41. d[i]=inf;
  42. d[1]=0;
  43. maxd=0;
  44. minn=inf;
  45. for(int i=1;i<=n;i++) //之前又犯错!先枚举过度点!
  46. for(int j=1;j<=n;j++)
  47. for(int k=1;k<=n;k++)
  48. if(a[j][i]+a[i][k]<a[j][k])
  49. a[j][k]=a[j][i]+a[i][k];
  50. }
  51. int main()
  52. {
  53. for(int i=0;i<31;i++)
  54. bit[i]=1<<i;
  55. while(scanf("%d",&n)!=EOF)
  56. {
  57. for(int i=1;i<=n;i++)
  58. for(int j=1;j<=n;j++)
  59. scanf("%d",&a[i][j]);
  60. init();
  61. for(int i=2;i<=n;i++)
  62. {
  63. scanf("%d",&da[i]);
  64. if(da[i]>maxd)maxd=da[i];
  65. }
  66. dfs(1,1,0,1);
  67. if(minn!=inf)
  68. printf("%d\n",minn);
  69. else
  70. printf("-1\n");
  71. }
  72. return 0;
  73. }

hdu4848 求到达每个点总时间最短(sum[d[i]])。的更多相关文章

  1. hdu4848 求到达每一个点总时间最短(sum[d[i]])。

    開始的时候是暴力dfs+剪枝.怎么也不行.后来參考他人思想: 先求出每一个点之间的最短路(这样预处理之后的搜索就能够判重返回了).截肢还是关键:1最优性剪枝(尽量最优:眼下的状态+估计还有的最小时间& ...

  2. 解决N个人过桥时间最短问题(Java版本)

    [问题描述] n个人要晚上过桥,在任何时候最多两个人一组过桥,每组要有一只手电筒.在这n个人中只有一个手电筒能用,因此要安排以某种往返的方式来返还手电筒,使更多的人可以过桥.   注意:每个人的过桥速 ...

  3. linux time-统计给定命令所花费的总时间

    推荐:更多linux 性能监测与优化 关注:linux命令大全 time命令用于统计给定命令所花费的总时间. 语法 time(参数) 参数 指令:指定需要运行的额指令及其参数. 实例 当测试一个程序或 ...

  4. time---统计命令所花费的总时间

    time命令用于统计给定命令所花费的总时间. 语法 time(参数) 参数 指令:指定需要运行的额指令及其参数. 实例 当测试一个程序或比较不同算法时,执行时间是非常重要的,一个好的算法应该是用时最短 ...

  5. SQL_求集合中每天最大时间记录的总和

    --问题求 集合中每天最大时间的总和 表中的数据 列: 用户 分数 时间 A 2 2014-01-01 01:00:00 A 2 2014-01-01 02:00:00 A 2 2014-01-01 ...

  6. [Leetcode 216]求给定和的数集合 Combination Sum III

    [题目] Find all possible combinations of k numbers that add up to a number n, given that only numbers ...

  7. Rescue(BFS时间最短 另开数组或优先队列)

    Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The prison is described as a N * M ...

  8. 【2018 ICPC亚洲区域赛徐州站 A】Rikka with Minimum Spanning Trees(求最小生成树个数与总权值的乘积)

    Hello everyone! I am your old friend Rikka. Welcome to Xuzhou. This is the first problem, which is a ...

  9. Java 求n天前的时间或者n月前的时间

    时间格式化 public static String DEFAULT_FORMATDATE = "yyyy-MM-dd"; 1.n天前的日期 /** * luyanlong * 默 ...

随机推荐

  1. 2010: C语言实验——逆置正整数

    2010: C语言实验——逆置正整数 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 949  Solved: 691[Submit][Status][We ...

  2. caffe修改需要的东西 6:40

    https://blog.csdn.net/zhaishengfu/article/details/51971768?locationNum=3&fps=1

  3. ios 点餐系统

    这个程序的主要界面就是一个TabBarController.总共三个标签,第一个是所有的可点的菜,第二个是已点的菜,第三个是可以留言或者查看所有留言. 下面是第一个页面: 右上角的i按钮是添加新菜,每 ...

  4. (33)zabbix proxy分布式监控配置

    概述 zabbix proxy可以代替zabbix server检索客户端的数据,然后把数据汇报给zabbix server,并且在一定程度上分担了zabbix server的压力.zabbix pr ...

  5. 学习python的第十天(内置算法:列表数据类型,元祖数据类型,字典数据类型)

    5.8自我总结 1.列表类型内置算法 1.必须掌握 1.按索引取值(正向取值+反向取值),即可存也可以取 #用于取其中一个值 name = ['yang','wen','yi'] ##正方向取wen, ...

  6. Spring中线程池的使用

    <bean id="threadPoolTaskExecutor" class="org.springframework.scheduling.concurrent ...

  7. .NET:权限管理

    题外话: 临近大四,编写各种简历的时候发现,很多电子简历上是可以链上自己在各大论坛上留下的足迹.关于这点,学习网络,拥抱开源,具有互联网思维的博主很后悔,后悔当年只会在网上查资料,不会留资料,空有才能 ...

  8. 算法学习记录-图——最小生成树之Kruskal算法

    之前的Prim算法是基于顶点查找的算法,而Kruskal则是从边入手. 通俗的讲:就是希望通过 边的权值大小 来寻找最小生成树.(所有的边称为边集合,最小生成树形成的过程中的顶点集合称为W) 选取边集 ...

  9. json分享

    JSON是什么? JavaScript Object Notation (JSON) is a text format for the serialization of structured data ...

  10. STM32F407 DAC 个人笔记

    DAC框图 VDDA:模拟电源输入 VSSAL:模拟电源接地输入 Vref+:正模拟参考电压输入 -------------- DORx:输入数字寄存器 DAC_OUT:模拟输出通道 DAC_OUT1 ...