开始的时候是暴力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;
}

最新文章

  1. 设计模式--组合模式Composite(结构型)
  2. [MySQL]show index from tb_name命令各列的含义
  3. PL/SQL Developer 和 instantclient客户端安装配置(图文)
  4. JS execCommand 方法
  5. 实现iOS图片等资源文件的热更新化(五): 一个简单完整的资源热更新页面
  6. 转 Xenserver HVM is required for this operation的解决办法
  7. Spring Data Solr教程(翻译)
  8. 解决 Chrome 浏览器自动调整小于11px字体的问题
  9. Objective-C总Runtime的那点事儿(一)消息机制【转】
  10. Lazarus中TreeView导出XML以及XML导入TreeView
  11. javascript原生ajax;
  12. hdu 2850 Load Balancing (优先队列 + 贪心)
  13. javascript数组、对象和Null的typeof同为object,区分解决办法
  14. css样式表及属性
  15. node.js 抓取
  16. 项目中写到看到的一些LINQ和Lambda语句
  17. Python——类的封装
  18. Django主线
  19. Lua Linux环境下安装
  20. Chap4:区块链的应用技术[《区块链中文词典》维京&amp;甲子]

热门文章

  1. 朴素贝叶斯分类&lt;转载&gt;
  2. Java MiniUi datagrid加载数据时,如果使用virtualScroll=&quot;false&quot;,数据多一点可能就会加载不出来
  3. [NOI2010]海拔——最小割+对偶图
  4. 什么是Java内存模型中的happens-before
  5. PAT (Basic Level) Practise (中文)- 1024. 科学计数法 (20)
  6. C# 队列Queue
  7. java在线聊天项目0.9版 实现把服务端接收到的信息返回给每一个客户端窗口中显示功能之客户端接收
  8. JavaScript设计模式基础之闭包(终)
  9. 洛谷 P2032 扫描
  10. ZOJ Monthly, January 2019-Little Sub and Pascal's Triangle