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最优性剪枝(尽量最优:眼下的状态+估计还有的最小时间& ...
- 解决N个人过桥时间最短问题(Java版本)
[问题描述] n个人要晚上过桥,在任何时候最多两个人一组过桥,每组要有一只手电筒.在这n个人中只有一个手电筒能用,因此要安排以某种往返的方式来返还手电筒,使更多的人可以过桥. 注意:每个人的过桥速 ...
- linux time-统计给定命令所花费的总时间
推荐:更多linux 性能监测与优化 关注:linux命令大全 time命令用于统计给定命令所花费的总时间. 语法 time(参数) 参数 指令:指定需要运行的额指令及其参数. 实例 当测试一个程序或 ...
- time---统计命令所花费的总时间
time命令用于统计给定命令所花费的总时间. 语法 time(参数) 参数 指令:指定需要运行的额指令及其参数. 实例 当测试一个程序或比较不同算法时,执行时间是非常重要的,一个好的算法应该是用时最短 ...
- SQL_求集合中每天最大时间记录的总和
--问题求 集合中每天最大时间的总和 表中的数据 列: 用户 分数 时间 A 2 2014-01-01 01:00:00 A 2 2014-01-01 02:00:00 A 2 2014-01-01 ...
- [Leetcode 216]求给定和的数集合 Combination Sum III
[题目] Find all possible combinations of k numbers that add up to a number n, given that only numbers ...
- Rescue(BFS时间最短 另开数组或优先队列)
Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The prison is described as a N * M ...
- 【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 ...
- Java 求n天前的时间或者n月前的时间
时间格式化 public static String DEFAULT_FORMATDATE = "yyyy-MM-dd"; 1.n天前的日期 /** * luyanlong * 默 ...
随机推荐
- Synchronized关键字整理
Synchronized关键字整理 作用:能够保证在同一时刻最多只有一个线程执行该段代码,以达到保证并发安全效果. 两个用法: 1.对象锁: 包括方法锁(默认锁对象为this当前实例对象)和同步代码块 ...
- django连接Oracle过程中出现的问题
开始时版本信息: python 3.6 + ce_oracle 6 最终版本信息: python 3.5 + ce_oracle 5.2 ce_oracle版本问题 cx_Oracle-5 ...
- robotframework接口测试实例
*** Settings *** Library Collections Library RequestsLibrary *** Test Cases *** test Create Session ...
- nyoj-1103-区域赛系列一多边形划分
http://acm.nyist.net/JudgeOnline/problem.php?pid=1103 区域赛系列一多边形划分 时间限制:1000 ms | 内存限制:65535 KB 难度: ...
- 使用custom elements和Shadow DOM自定义标签
具体的api我就不写 官网上面多 如果不知道这个的话也可以搜索一下 目前感觉这个还是相当好用的直接上码. <!DOCTYPE html> <html lang="en&q ...
- 【计算机网络】DNS的作用以及修改DNS的方法
1.DNS的作用及修改DNS的方法 1.1.DNS的作用 DNS就是将域名映射成ip的分布式数据库服务器,它的作用如下图: 1.2.修改DNS的方法 常用的DNS服务器 1.114.114.114.1 ...
- (64)zabbix正则表达式应用
概述 在前面的<zabbix low-level discovery>一文中有filter一项,用于从结果中筛选出你想要的结果,比如我们在filter中填入^ext|^reiserfs则表 ...
- PHP开发中涉及到emoji表情的几种处理方法!
emoji表情 处理 一般Mysql表设计时,都是用UTF8字符集的.把带有emoji的昵称字段往里面insert一下就没了,整个字段变成了空字符串.这是怎么回事呢? 原来是因为Mysql的utf8字 ...
- Python的第二堂课(2)
一.初探python print('Hello,靓仔!') 不得不说,这句话还是so real的(逃 二.Python中的变量 1.什么是变量?(what) 量:记录某种现实世界中事物的某种状态: 变 ...
- nw335 debian sid x86-64 -- 2 驱动的方式
1 linux内核自带 2 realtek 提供的官方驱动 3 使用xp的驱动 4 第三方驱动(现在成功的,最好的方式)