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 * 默 ...
随机推荐
- CentOS 7.0关闭防火墙
.关闭firewall: systemctl stop firewalld.service #停止firewall systemctl disable firewalld.service #禁止fir ...
- js 两个数组对象根据账号比较去重,解决直接splice后数组索引改变
目的获取Arr2中不包含在arr1中的对象 根据Account进行比较,如果相等则删除tempArr数组对象. 结果返回张三 var arr1=[{"account":" ...
- 7.逻辑运算 and or not
1)优先级 ()> not > and > o r and:真真为真,真假为假 ,假假为假 or:真真为真,真假为真,假假为假 print(2 > 1 and 1 < ...
- [CODEVS] 2193 数字三角形WW
数字三角形必须经过某一个点,使之走的路程和最大 从必须经过的点,向上向下分别DP两次的和即为答案. 还有一种思路是把和必须经过点同一行的设为-INF,这样就一定(大概)不会选择它们了. //Write ...
- 【Java_多线程并发编程】基础篇——线程状态扭转函数
1. wait() sleep() yield() join()用法与区别 本文提到的当前线程是指:当前时刻,获得CPU资源正在执行的线程. 1.1 wait()方法 wait()方法定义在Objec ...
- uboot下include\autoconfig.mk分析
CONFIG_CMD_FAT=yCONFIG_HARD_I2C=yCONFIG_IMX_OTP=yCONFIG_CMD_ITEST=yCONFIG_ETH_PRIME=yCONFIG_CMD_BDI= ...
- Codeforces Round #877 (Div. 2) B. - Nikita and string
题目链接:http://codeforces.com/contest/877/problem/B Nikita and string time limit per test2 seconds memo ...
- Java实现——字符串分割以及复制目录下的所有文件
0. 前言 今天有个需求,把Android中data/data目录下指定(通过读预置的XML文件)的多个应用下的多个目录全部内容通过OTG模式复制到U盘中. 首先读取XML文件内的某个节点的属性值, ...
- Java-在一个包装器对象中包装一个原始类型
使用基本类型的包装对象,好处可以为空且可以序列化 package com.tj; public class MyClass2 { public static void main(String[] ar ...
- Java-对复合类型数据进行排序
Array.sort(arr)可以进行简单的排序,如果需要复杂的排序可以实现Comparable package com.tj; import java.util.Arrays; public cla ...