[luogu]P3959

宝藏【TREASURE】

题目描述

参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋, 也给出了这 n 个宝藏屋之间可供开发的 m 条道路和它们的长度。

小明决心亲自前往挖掘所有宝藏屋中的宝藏。但是,每个宝藏屋距离地面都很远, 也就是说,从地面打通一条到某个宝藏屋的道路是很困难的,而开发宝藏屋之间的道路 则相对容易很多。

小明的决心感动了考古挖掘的赞助商,赞助商决定免费赞助他打通一条从地面到某 个宝藏屋的通道,通往哪个宝藏屋则由小明来决定。

在此基础上,小明还需要考虑如何开凿宝藏屋之间的道路。已经开凿出的道路可以 任意通行不消耗代价。每开凿出一条新道路,小明就会与考古队一起挖掘出由该条道路 所能到达的宝藏屋的宝藏。另外,小明不想开发无用道路,即两个已经被挖掘过的宝藏 屋之间的道路无需再开发。

新开发一条道路的代价是:

L×K
L代表这条道路的长度,K代表从赞助商帮你打通的宝藏屋到这条道路起点的宝藏屋所经过的 宝藏屋的数量(包括赞助商帮你打通的宝藏屋和这条道路起点的宝藏屋) 。

请你编写程序为小明选定由赞助商打通的宝藏屋和之后开凿的道路,使得工程总代 价最小,并输出这个最小值。

输入输出格式

输入格式:
第一行两个用空格分离的正整数 n 和 m,代表宝藏屋的个数和道路数。

接下来 m 行,每行三个用空格分离的正整数,分别是由一条道路连接的两个宝藏 屋的编号(编号为 1~n),和这条道路的长度 v。

输出格式:
输出共一行,一个正整数,表示最小的总代价。

输入输出样例
输入样例1#:
4 5
1 2 1
1 3 3
1 4 1
2 3 4
3 4 1
输出样例1#:
4

输入样例2#:
4 5
1 2 1
1 3 3
1 4 1
2 3 4
3 4 2
输出样例2#:
5

【样例解释1】

小明选定让赞助商打通了 1 号宝藏屋。小明开发了道路 1 \to 21→2,挖掘了 2 号宝 藏。开发了道路 1 \to 41→4,挖掘了 4 号宝藏。还开发了道路 4 \to 34→3,挖掘了 3 号宝 藏。工程总代价为:1 \times 1 + 1 \times 1 + 1 \times 2 = 4 1×1+1×1+1×2=4
【样例解释2】

小明选定让赞助商打通了 1 号宝藏屋。小明开发了道路 1 \to 21→2,挖掘了 2 号宝 藏。开发了道路 1 \to 31→3,挖掘了 3 号宝藏。还开发了道路 1 \to 41→4,挖掘了 4 号宝 藏。工程总代价为:1 \times 1 + 3 \times 1 + 1 \times 1 = 51×1+3×1+1×1=5
【数据规模与约定】

对于 20%的数据:保证输入是一棵树,1≤n≤8,v≤5000 且所有的 v 都相等。
对于 40%的数据:1≤n≤8,0≤m≤1000,v≤5000 且所有的 v 都相等。
对于 70%的数据:1≤n≤8,0≤m≤1000,v≤5000
对于 100%的数据:1≤n≤12,0≤m≤1000,v≤500000


数据很小,状压DP。
用f[i][s]表示s状态下,最深的为i的方案的最优解。
转移:f[i][s|t]=Min{f[i-1][s]+v*(i-1)}
v*i为转移代价,t为s的补集的子集(需要一些点作为下一层)。
注意点:
<i>枚举子集,for(t=U;t;t=U&(t-1)),在后面逐个删0,最前面1被删除后换下一个。[这个要自己体会啦,别人说不清楚]
<ii>预处理v的代价,枚举s,对于每一个s,把一个点加入s的最小代价预处理以提高效率。
代码:

 #include<iostream>
 #include<cstdio>
 #include<cstring>
 using namespace std;
 inline int read();
 int Min(int x,int y){return x<y?x:y;}
 namespace lys{
      ;
     int n,m,ans;
     ][<<],d[],e[][];
     int main(){
         int i,j,S,U,t,u,v,w;
         n=read(); m=read();
         ;i<n;i++) ;j<n;j++) e[i][j]=inf;
         ;i<=n;i++) ;j<(<<n);j++) dp[i][j]=inf;
         ;i<n;i++) dp[][<<i]=;
         ;i<=m;i++){
             u=read(); v=read(); w=read();
             e[u-][v-]=e[v-][u-]=Min(e[u-][v-],w);
         }
         ;S<(<<n);S++){
             ;i<n;i++){
                 d[i]=inf;
                 ;j<n;j++) ) d[i]=Min(d[i],e[i][j]);
             }
             <<n)-),t=U;t;t=U&(t-)){
                 v=;
                 ;i<n;i++) ){
                     v+=d[i];
                     if(v>=inf) break ;
                 }
                 ;i<=n;i++) dp[i][S|t]=Min(dp[i][S|t],dp[i-][S]+(i-)*v);
             }
         }
         ans=inf;
         ;i<=n;i++) ans=Min(ans,dp[i][(<<n)-]);
         printf("%d\n",ans);
         ;
     }
 }
 int main(){
     lys::main();
     ;
 }
 inline int read(){
     ,ff=;
     char c=getchar();
     '){
         ;
         c=getchar();
     }
     +c-',c=getchar();
     return kk*ff;
 }

[luogu]P3959 宝藏[NOIP][状态压缩DP]的更多相关文章

  1. NOIP 2017 P3959 宝藏 (状态压缩DP板子)

    洛谷题目传送门!! 题目的N这么小,当然是选择用状压DP啦!  等等,我好像不会状缩.... 首先,我们当然是要写状态转移方程了!! 那么,如果我们设  f[s]  状态s下,所要的最小花费,那么很显 ...

  2. [Luogu P3959] 宝藏 (状压DP+枚举子集)

    题面 传送门:https://www.luogu.org/problemnew/show/P3959 Solution 这道题的是一道很巧妙的状压DP题. 首先,看到数据范围,应该状压DP没错了. 根 ...

  3. luogu P2704 炮兵阵地(经典状态压缩DP)

    方格有m*n个格子,一共有2^(m+n)种排列,很显然不能使用暴力法,因而选用动态规划求解. 求解DP问题一般有3步,即定义出一个状态 求出状态转移方程 再用算法实现.多数DP题难youguan点在于 ...

  4. 最短路+状态压缩dp(旅行商问题)hdu-4568-Hunter

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4568 题目大意: 给一个矩阵 n*m (n m<=200),方格里如果是0~9表示通过它时要花 ...

  5. hoj2662 状态压缩dp

    Pieces Assignment My Tags   (Edit)   Source : zhouguyue   Time limit : 1 sec   Memory limit : 64 M S ...

  6. POJ 3254 Corn Fields(状态压缩DP)

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4739   Accepted: 2506 Descr ...

  7. [知识点]状态压缩DP

    // 此博文为迁移而来,写于2015年7月15日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102w6jf.html 1.前 ...

  8. HDU-4529 郑厂长系列故事——N骑士问题 状态压缩DP

    题意:给定一个合法的八皇后棋盘,现在给定1-10个骑士,问这些骑士不能够相互攻击的拜访方式有多少种. 分析:一开始想着搜索写,发现该题和八皇后不同,八皇后每一行只能够摆放一个棋子,因此搜索收敛的很快, ...

  9. DP大作战—状态压缩dp

    题目描述 阿姆斯特朗回旋加速式阿姆斯特朗炮是一种非常厉害的武器,这种武器可以毁灭自身同行同列两个单位范围内的所有其他单位(其实就是十字型),听起来比红警里面的法国巨炮可是厉害多了.现在,零崎要在地图上 ...

随机推荐

  1. MyBatis Mapper XML 详解

    MyBatis Mapper XML 详解 MyBatis 真正的力量是在映射语句中.这里是奇迹发生的地方.对于所有的力量,SQL 映射的 XML 文件是相当的简单.当然如果你将它们和对等功能的 JD ...

  2. 教你用 Netty 实现一个简单的 RPC!

    众所周知,dubbo 底层使用了 Netty 作为网络通讯框架,而 Netty 的高性能我们之前也分析过源码,对他也算还是比较了解了. 今天我们就自己用 Netty 实现一个简单的 RPC 框架. 1 ...

  3. C++中前置操作符和后置操作符的重载

    1,C 语言中讨论了原生含义,C++ 中有必要考虑前置.后置操作符能够重载,有何问题: 2,值得思考的问题: 1,下面的代码有没有区别?为什么? 1,i++  // i 的值作为返回值,i 自增 1: ...

  4. 小白学习django第二站-模版配置

    上一站说道app创建,接下来我们来配置app的url路由 首先需要到setting.py中添加book这个app, 再到django_test文件里的urls添加路由 include() : 这个函数 ...

  5. 查找元素在list中的位置以及折半查询

    问题 查找某个值在list中的位置 解决思路 能够用折半查询的方法解决此问题. 解决(Python) #! /usr/bin/env python #coding:utf-8 #折半查找某个元素在li ...

  6. Solution for automatic update of Chinese word segmentation full-text index in NEO4J

    Solution for automatic update of Chinese word segmentation full-text index in NEO4J 1. Sample data 2 ...

  7. Android 之 悬浮窗口

    1. 创建并设置  WindowManager  类 WindowManager mWindowManager; // 取得系统窗体 mWindowManager = (WindowManager) ...

  8. Ubuntu安装openssh安装ssh、 免密登录、 创建新用户并免密登录

               一.安装openssh sudo apt-get install openssh-server ssh localhost 二.免密登录 cd ~/.ssh ssh-keygen ...

  9. 初探CSS -3 语法

    CSS 语法 实例 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> < ...

  10. Python 安装cx_Oracle模块折腾笔记

    kali linux/ubuntu下安装: 不得不说安装这个模块很蛋疼,决定做个记录. sudo apt install build-essential unzip python-dev libaio ...