题目传送门:https://www.luogu.org/problemnew/show/P3959

题意:给出一个有$N$个点的图,求其中的一个生成树(指定一个点为根),使得$\sum\limits_{i=1}^{N-1} v_i \times dep_i$最小,其中$v_i$为生成树上某条边的边权,$dep_i$为这条边连接的两个点中深度较浅的点的深度。$N \leq 12 , v \leq 5 \times 10^5$


$N \leq 12$给我们一个很强烈的信息:状态压缩

(所以这题还可以用暴力枚举+可持久化并查集拿90pts,用%你退火和诡异贪心拿到满分)

我们不妨考虑一层一层加入点

设$g_{i,j}$表示点集$j$向点集$i$每个点连一条边的最小权值和,可以在$O(3^NN^2)$的复杂度内算出(似乎可以优化成$O(3^NN)$)

然后设$f_{i,j}$表示现在的生成树中有$i$层节点,其中深度最深的节点集合为$j$时的最小权值,考虑转移为$f_{i+1,k}=f_{i,j}+g_{j,k}$

最后答案为$min\{f_{k,(1<<N)-1}\}$

复杂度为$O(3^NN^2)$,实际可优化成$O(3^NN)$

 // luogu-judger-enable-o2
 #include<bits/stdc++.h>
 #define MAXN (1 << 12) + 1
 using namespace std;

 inline int read(){
     ;
     char c = getchar();
     while(!isdigit(c))
         c = getchar();
     while(isdigit(c)){
         a = (a << ) + (a << ) + (c ^ ');
         c = getchar();
     }
     return a;
 }

 inline int min(int a , int b){
     return a < b ? a : b;
 }

 ][MAXN] , route[][];

 int main(){
     memset(route , 0x3f , sizeof(route));
     memset(g , 0x3f , sizeof(g));
     int N = read() , M = read();
     ){
         cout << ;
         ;
     }
      ; i < N ; i++)
         g[][ << i] = ;
     while(M--){
         int a = read() , b = read() , c = read();
         route[a][b] = route[b][a] = min(route[a][b] , c);
     }
      ; i <  << N ; i++){
          << N) - ) ^ i;
          & s){
             int p = j;
             for(int k = p & -p ; p ; k = p & -p){
                 int minN = 0x3f3f3f3f;
                 p -= k;
                  , q = i;
                 for(int m = q & -q ; q ; m = q & -q){
                     q -= m;
                     minN = min(minN , route[t][(]);
                 }
                 if(minN == 0x3f3f3f3f){
                     f[i][j] = 0x3f3f3f3f;
                     break;
                 }
                 f[i][j] += minN;
             }
         }
     }
      ; i < N ; i++)
          ; j <  << N ; j++){
             if(j == (j & -j))
                 continue;
              & j ; k ; k = k -  & j)
                 ][j ^ k] != 0x3f3f3f3f)
                     g[i][j] = min(g[i][j] , g[i - ][j ^ k] + f[j ^ k][k] * i);
         }
     int all = 0x7fffffff;
      ; i < N ; i++)
         all = min(all , g[i][( << N) - ]);
     cout << all;
     ;
 }

Luogu3959 NOIP2017 宝藏 状压DP的更多相关文章

  1. [NOIP2017]宝藏 状压DP

    [NOIP2017]宝藏 题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋, 也给出了这 n 个宝藏屋之间可供开发的 m 条道路和它们的长度. 小明决心亲自前往挖 ...

  2. 洛谷$P3959\ [NOIp2017]$ 宝藏 状压$dp$

    正解:状压$dp$ 解题报告: 传送门$QwQ$ $8102$年的时候就想搞这题了,,,$9102$了$gql$终于开始做这题了$kk$ 发现有意义的状态只有当前选的点集和深度,所以设$f_{i,j} ...

  3. Luogu 3959 [NOIP2017] 宝藏- 状压dp

    题解 真的想不到这题状压的做法...听说还有跑的飞快的模拟退火,要是现场做绝对滚粗QAQ. 不考虑深度,先预处理出 $pt_{i, S}$ 表示让一个不属于 集合 $S$ 的 点$i$ 与点集 $S$ ...

  4. $[NOIp2017]$ 宝藏 状压$dp$

    \(Sol\) 觉得这里是个很巧妙的地方吖,就是记下当前扩展点集的最大深度,然后强制下一步扩展的点集都是最大深度+1.这样做在当前看可能会导致误算答案导致答案偏大,但是整个\(dp\)完成后一定可以得 ...

  5. NOIp2017D2T2(luogu3959) 宝藏 (状压dp)

    时隔多年终于把这道题锅过了 数据范围显然用搜索剪枝状压dp. 可以记还有哪些点没到(或者已到了哪些点).我们最深已到的是哪些点.这些点的深度是多少,然后一层一层地往下推. 但其实是没必要记最深的那一层 ...

  6. P3959 宝藏 状压dp

    之前写了一份此题关于模拟退火的方法,现在来补充一下状压dp的方法. 其实直接在dfs中状压比较好想,而且实现也很简单,但是网上有人说这种方法是错的...并不知道哪错了,但是就不写了,找了一个正解. 正 ...

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

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

  8. 计蒜客 宝藏 (状压DP)

    链接 : Here! 思路 : 状压DP. 开始想直接爆搜, T掉了, 然后就采用了状压DP的方法来做. 定义$f[S]$为集合$S$的最小代价, $dis[i]$则记录第$i$个点的"深度 ...

  9. loj2318 「NOIP2017」宝藏[状压DP]

    附带其他做法参考:随机化(模拟退火.爬山等等等)配合搜索剪枝食用. 首先题意相当于在图上找一颗生成树并确定根,使得每个点与父亲的连边的权乘以各自深度的总和最小.即$\sum\limits_{i}dep ...

随机推荐

  1. android recovery代码修改之原生建议

    我们都知道recovery升级的时候,是根据升级脚本updater-script里面的函数,去一步步执行的,比如mount,format等相关的操作,有时候我们需要增加一些自己特殊的更新的接口,这时候 ...

  2. AOP缓存实现

    输入参数索引作为缓存键的实现 using MJD.Framework.CrossCutting; using MJD.Framework.ICache; using System; using Sys ...

  3. 分享MYSQL中的各种高可用技术

    分享MYSQL中的各种高可用技术 图片和资料来源于姜承尧老师(MYSQL技术内幕作者) mysql高可用各个技术的比较 数据库的可靠指的是数据可靠 数据库可用指的是数据库服务可用 可靠的是数据:例如工 ...

  4. [MapReduce_add_3] MapReduce 通过分区解决数据倾斜

    0. 说明 数据倾斜及解决方法的介绍与代码实现 1. 介绍 [1.1 数据倾斜的含义] 大量数据发送到同一个节点进行处理,造成此节点繁忙甚至瘫痪,而其他节点资源空闲 [1.2 解决数据倾斜的方式] 重 ...

  5. Linux命令大全总结

    目录方面的命令:ls,dir,cd,clear,mkdir ls 显示指定目录的文件和目录 ls -a 列出目录下的所有文件,包括以 . 开头的隐藏文件 ls -l 显示指定目录的详细列表 ls -R ...

  6. Base64编码/解码

    /// <summary> /// Base64编码 /// </summary> /// <param name="str">字符串</ ...

  7. $Matrix-Tree$定理-题目

    $Matrix-Tree$ 其实矩阵树的题挺好玩的,一些是套班子求答案的,也有一些题目是靠观察基尔霍夫矩阵性质推式子的. 文艺计算姬:https://www.lydsy.com/JudgeOnline ...

  8. Idea设置快捷键以及修改Eclipse的debug快捷键

    Idea强大不多说了,用久了都可以习惯,但是感觉Idea的debug真是不如eclipse好用,Idea的快捷键都是组合键,用着繁琐.两种方法可以设置eclipse的快捷键: 1:直接全局都使用ecl ...

  9. Tribonacci UVA - 12470 (简单的斐波拉契数列)(矩阵快速幂)

    题意:a1=0;a2=1;a3=2; a(n)=a(n-1)+a(n-2)+a(n-3);  求a(n) 思路:矩阵快速幂 #include<cstdio> #include<cst ...

  10. PHP开发api接口安全验证方法一

    前台想要调用接口,需要使用几个参数生成签名.时间戳:当前时间随机数:随机生成的随机数 签名:特定方法生成的sign签名 算法规则在前后台交互中,算法规则是非常重要的,前后台都要通过算法规则计算出签名, ...