hdu4848 求到达每个点总时间最短(sum[d[i]])。
2014-07-27 11:46
267 查看
开始的时候是暴力dfs+剪枝,怎么也不行。后来参考他人思想:
先求出每个点之间的最短路(这样预处理之后的搜索就可以判重返回了),截肢还是关键:1最优性剪枝(尽量最优:目前的状态+预计还有的最小时间>min就return !),2:可行性截肢:如果当前状态+预计状态已经不可行,return。(注意考虑是 continue,还是 return !).以及放的位置!在出口放的效果一般好一些(不在下次循环内部)(理由:若该状态是后面的状态进入的,前面的会dfs到很深,所以,放在最前面,一起判断下,不行就return 一般比较合理。)
先求出每个点之间的最短路(这样预处理之后的搜索就可以判重返回了),截肢还是关键: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 -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]])。
- 原创:原来准备创业的项目:公交服务构思,让一个人可以在最短时间内安全,快速,舒适的到达终点站
- 假设系统按单值方式运行且采用最短作业优先算法,有J1,J2,J3,J4共4个作业同时到达,则以下哪几种情况下的平均周转时间为10分钟?
- 【Codeforces Round 364 (Div 2)D】【二分答案 or 公式推导】As Fast As Possible 小朋友乘校车去远足最短到达时间
- 广搜最短路(最短时间到达目的地),POJ(3669)
- 动态规划之DP中判断是否到达某一状态(最短时间是什么)?
- 链表的应用:计算每个作业的运行时间
- 线性时间内统计一个字符串中每个字符出现的次数
- 一个判断抢购时间是否到达的简单的js函数
- 一个判断抢购时间是否到达的简单的js函数
- 判断链表是否带环?若带环求环的长度?若带环求环的入口点?并计算以上每个问题的时间复杂度?
- 求最短过桥时间问题
- 如何将最短时间将Github上的开源项目导入到android studio中
- python3爬虫,最短时间实现(三)
- 八种方法最短时间让人知道你的网站
- 最短时间过河
- 数据结构-关键路径 (最短时间)
- 课程设计 最小时间 最短路径 模板 .
- <笔记><算法导论> 假设求解问题的算法需要f(n)毫秒,对下表中的每个函数f(n)和时间t,确定可以在时间t内求解的问题的最大规模n。