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]])。,布布扣,bubuko.com

时间: 2024-10-14 00:19:12

hdu4848 求到达每个点总时间最短(sum[d[i]])。的相关文章

hdu4848 求到达每一个点总时间最短(sum[d[i]])。

開始的时候是暴力dfs+剪枝.怎么也不行.后来參考他人思想: 先求出每一个点之间的最短路(这样预处理之后的搜索就能够判重返回了).截肢还是关键:1最优性剪枝(尽量最优:眼下的状态+估计还有的最小时间>min就return !),2:可行性截肢:假设当前状态+估计状态已经不可行,return.(注意考虑是 continue.还是 return !).以及放的位置!在出口放的效果一般好一些(不在下次循环内部)(理由:若该状态是后面的状态进入的,前面的会dfs到非常深,所以.放在最前面.一起推断下,不

解决N个人过桥时间最短问题(Java版本)

[问题描述] n个人要晚上过桥,在任何时候最多两个人一组过桥,每组要有一只手电筒.在这n个人中只有一个手电筒能用,因此要安排以某种往返的方式来返还手电筒,使更多的人可以过桥.   注意:每个人的过桥速度不同,每组的速度由过桥最慢的人所用的时间决定,约定n<=1000,并且没有人的过桥时间会超过100秒. [输入] 输入的第一行给出n, 接下来的n行给出每个人的过桥时间,不会超过1000人,且没有人的过桥时间会超过100秒. 4 1 2 5 10 [输出] 输出的第一行给出所有n个人过桥的总的秒数

求质数数量 - 空间换时间

质数:被自己本身和1整出的数 int getPrimeCount(int value){ int count = 0; int arr[301] = {0};// 0 - is prime , 1 - is not prime int num = (int)sqrt((float)value); for(int i = 2; i <= num ; ++i){ if (!arr[i]){ for(int j = i; i * j < value; ++j){ arr[i * j] = 1; }

一种减少索引下载/切换总时间的技巧

现在商户索引下载时14台searcher机器同时下载索引大概要花10-12分钟,然后一组一组(3个分布式锁,5组)切换.假定warmup时间为1分半,所以下载+切换的总时间=10分钟 + 5 * 1.5分钟 = 17.5分钟. 注意到这里3台机器切换时,剩下的机器既不切换也不下载,如果能利用切换时间也做下载,将会省下多组切换时间,最理想是只花费1组切换时间,总时间为10分钟 + 1.5分钟 = 11.5分钟,可以省6.5分钟.一个技巧是使用下载分布式锁,不让14台服务器同时下载,这样就可以做到先

Hive 求月销售额和总销售额

求月销售额和总销售额a,01,150a,01,200b,01,1000b,01,800c,01,250c,01,220b,01,6000a,02,2000a,02,3000b,02,1000b,02,1500c,02,350c,02,280a,03,350a,03,250 create table t_store(name string comment '店铺',months int comment '月份',money int comment '金额') row format delimite

多个蚂蚁过独木桥,求通过的最长时间和最短时间

首先对题目进行分析: 求最长时间也就是最后掉下去的一只蚂蚁需要经历的最长时间: 求最短时间也就是最后掉下去的一只蚂蚁需要经历的最短时间:所以让所有的蚂蚁都向距离它们最近的那一段走,这样它们每个走的时间是短的,再求它们中用时最短的那个时间: 分析最长时间如下图所示: /************************************************************************* > File Name: 162.cpp > Author: > Mail:

Rescue(BFS时间最短)

Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The prison is described as a N * M (N, M <= 200) matrix. There are WALLs, ROADs, and GUARDs in the prison. Angel's friends want to save Angel. Their task is: approach Angel. We assume

UVA 10714-Ants(求花费的最大最小时间)

Ants Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Description Problem B: Ants An army of ants walk on a horizontal pole of length l cm, each with a constant speed of 1 cm/s. When a walking ant reaches an end of

html5 video获取当前时间和视频总时间长度

<video id="video-active" class="video-active" width="640" height="390" controls="controls"> <source src="myvideo.mp4" type="video/mp4"> </video> <div id="curre