hdu4848 求到达每一个点总时间最短(sum[d[i]])。
開始的时候是暴力dfs+剪枝。怎么也不行。后来參考他人思想:
先求出每一个点之间的最短路(这样预处理之后的搜索就能够判重返回了)。截肢还是关键:1最优性剪枝(尽量最优:眼下的状态+估计还有的最小时间>min就return !),2:可行性截肢:假设当前状态+估计状态已经不可行,return。(注意考虑是 continue。还是 return !).以及放的位置!在出口放的效果一般好一些(不在下次循环内部)(理由:若该状态是后面的状态进入的,前面的会dfs到非常深,所以。放在最前面。一起推断下,不行就return 一般比較合理。)
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- using namespace std;
- int n;int da[35];int d[35];
- int a[35][35];
- int maxd=0;
- const int inf=0x3f3f3f3f;
- int minn=inf;
- int bit[31];
- void dfs(int x,int lev,int sum,int allstate)
- {
- if(sum+d[x]*(n-lev)>=minn||d[x]>maxd){return;}
- if(allstate==(bit[n]-1))
- {
- minn=sum;
- return;
- }
- for(int i=2;i<=n;i++)
- {
- if((allstate&bit[i-1])==0&&d[x]+a[x][i]>da[i])
- return;
- }
- for(int i=2;i<=n;i++)
- {
- if((allstate&bit[i-1])==0)
- {
- int f=d[i];
- d[i]=d[x]+a[x][i];
- dfs(i,lev+1,sum+d[i],allstate|bit[i-1]);
- d[i]=f;
- }
- }
- return ;
- }
- void init()
- {
- int td=0;
- da[1]=0x3f3f3f3f-1;
- for(int i=1;i<=n;i++)
- d[i]=inf;
- d[1]=0;
- maxd=0;
- minn=inf;
- for(int i=1;i<=n;i++) //之前又犯错!
- 先枚举过度点!
- for(int j=1;j<=n;j++)
- for(int k=1;k<=n;k++)
- if(a[j][i]+a[i][k]<a[j][k])
- a[j][k]=a[j][i]+a[i][k];
- }
- int main()
- {
- for(int i=0;i<31;i++)
- bit[i]=1<<i;
- while(scanf("%d",&n)!=EOF)
- {
- for(int i=1;i<=n;i++)
- for(int j=1;j<=n;j++)
- scanf("%d",&a[i][j]);
- init();
- for(int i=2;i<=n;i++)
- {
- scanf("%d",&da[i]);
- if(da[i]>maxd)maxd=da[i];
- }
- dfs(1,1,0,1);
- if(minn!=inf)
- printf("%d\n",minn);
- else
- printf("-1\n");
- }
- return 0;
- }
hdu4848 求到达每一个点总时间最短(sum[d[i]])。的更多相关文章
- hdu4848 求到达每个点总时间最短(sum[d[i]])。
开始的时候是暴力dfs+剪枝,怎么也不行.后来参考他人思想: 先求出每个点之间的最短路(这样预处理之后的搜索就可以判重返回了),截肢还是关键:1最优性剪枝(尽量最优:目前的状态+预计还有的最小时间&g ...
- linux time-统计给定命令所花费的总时间
推荐:更多linux 性能监测与优化 关注:linux命令大全 time命令用于统计给定命令所花费的总时间. 语法 time(参数) 参数 指令:指定需要运行的额指令及其参数. 实例 当测试一个程序或 ...
- time---统计命令所花费的总时间
time命令用于统计给定命令所花费的总时间. 语法 time(参数) 参数 指令:指定需要运行的额指令及其参数. 实例 当测试一个程序或比较不同算法时,执行时间是非常重要的,一个好的算法应该是用时最短 ...
- LeetCode 681. Next Closest Time 最近时刻 / LintCode 862. 下一个最近的时间 (C++/Java)
题目: 给定一个"HH:MM"格式的时间,重复使用这些数字,返回下一个最近的时间.每个数字可以被重复使用任意次. 保证输入的时间都是有效的.例如,"01:34" ...
- 获取当前时间UTC时间的下一个15分钟时间点
ZonedDateTime zdt = ZonedDateTime.now(ZoneOffset.UTC); int now15Minute = zdt.getMinute() / P15MINUTE ...
- loj 1257 (求树上每一个点到树上另一个点的最长距离)
题目链接:http://lightoj.com/volume_showproblem.php?problem=1257 思路:首先需要用到一个知识点就是树上任一点到树上最长直径的某一个端点的距离最远, ...
- 【測试工具】一个将Unix时间转换为通用时间的工具
一个将Unix时间转换为通用时间的工具 演示效果: 点击转换之后变为: 源码: function calctime2(){ var time = window.document.getElementB ...
- agruments应用——求出函数参数的总合&&css函数——设置/读取对象的属性&&当前输入框高亮显
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- java例题_44 一个偶数总能表示为两个素数之和
1 /*44 [程序 44 偶数的素数和] 2 题目:一个偶数总能表示为两个素数之和. 3 */ 4 5 /*分析 6 * 1.从键盘得到一个偶数(大于2的偶数,因为1不是素数) 7 * 2.用for ...
随机推荐
- Linux免密登录
ssh连接上服务器 ssh -p 端口 用户名@ip地址 获取本地的pub ssh key cd ~/.ssh vi id_rsa.pub 拷贝里面的内容 将拷贝的内容放到服务器的authorized ...
- hdu 4545 贪心 *
题意:小明和他的好朋友小西在玩一个新的游戏,由小西给出一个由小写字母构成的字符串,小明给出另一个比小西更长的字符串,也由小写字母组成,如果能通过魔法转 换使小明的串和小西的变成同一个,那么他们两个人都 ...
- C#中常见的系统内置委托用法详解(抄录)
C#中常见的系统内置委托 Action类.Func类.Predicate<T>.Comparison<T>委托 Action类的委托 Action委托 封装一个方法,该方法不具 ...
- 分布式文件系统 ~MogileFS~
一.分布式文件系统 分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连,也就是集群文件系统,可以支持 ...
- vultr vs digitalocean vs linode
vultr官方网站:www.vultr.comdigitalocean官方网站:www.digitalocean.comlinode官方网站:www.linode.com 一般来说我们买VPS的时候都 ...
- debian安装ibus中文输入法
转载自:http://www.shunix.com/debian-ibus-chinese-470/ 以前在debian一直用scim,但是那个真的很不好用,现在用的是debian squeeze还是 ...
- extjs 动态设定 DateField 最大值 最小值
yxrqDate.minValue = new Date();yxrqDate.maxValue = new Date(9000,1,1);yxrqDate.validate(); //var pic ...
- 谷歌死忠速查:可访问谷歌google搜索的IP们
[见谅! 此文已废了,下面的办法已经无效了!]但是访问我博客并回复的哥们“问天何必”提供了一个方法,详见http://www.gaomn.com/,他提供了一个网站来访问google的,速度还算可以, ...
- Gedit
Use Gedit as Remote File Editor via FTP and SSH Migrating from Windows Vista to Ubuntu 8.04 and have ...
- 混沌数学之Arnold模型
相关软件混沌数学之离散点集图形DEMO 相关代码: class ArnoldEquation : public DiscreteEquation { public: ArnoldEquation() ...