原文链接https://www.cnblogs.com/zhouzhendong/p/9261079.html

题目传送门 - 洛谷P3959

题目传送门 - Vijos P2032

题意

  给定一个 $n$ 个节点 $m$ 条边的无向图。

  现在请你在这个图之上生成一个有根树。

  记 $d_i$ 为节点 $i$ 的深度 $(d_{root}=0)$ ,记 $fadis_i$ 为节点 $i$ 到其父亲节点的连边中的最小边权。

  则这棵树的代价为

$$\sum_{i=1}^{n}(d_i\times fadis_i)$$

  问所有生成树中最小代价为多少。

  $1\leq n\leq 12,0\leq m\leq 1000, 边权\leq 500000$

题解

  我们记 $dp[x][d][s]$ 表示以 $x$ 为子树根,其深度为 $d$ ,要在该子树内完成集合 $s$ 中节点的连接,所需要花费的最小代价。

  则显然可以写出 DP 方程:

  (其中 $g[x][y]$ 代表 $x$ 到 $y$ 的最小边权)

$$dp[x][d][s]=\min(dp[y][d+1][s1 \backslash \{y\}]+g[x][y]\times (d+1)+dp[x][d][s-s1]\bigg| s1\subset s)$$

  至于集合 $s,s2$ 我们可以状压表示。

  现在我们来分析一下时间复杂度。

  首先我们看到前两维以及枚举 $y$ ,每一维一个 $O(n)$。

  最重要的是最后一维。

  这维的复杂度要和剩下的转移复杂度一起算,因为转移复杂度与这一维的数字有关。

  如果这一维集合 $|s|=i$ ,则有 $2^i$ 种子集。满足 $|s|=i$ 的 $s$ 有 $\binom{n}{i}$ 个。

  所以这两部分总的复杂度为:(其中要用到:二项式定理)

$$\begin{eqnarray*}\sum_{i=0}^{n}\binom{n}{i}2^i&=&\sum_{i=0}^{n}\binom{n}{i}2^i\times 1^{n-i}\\&=&(1+2)^n\\&=&3^n \end{eqnarray*}$$

  所以总的复杂度为 $O(n^33^n)$ ,注意常数大会被卡。

  写到这里不禁让我想起某猪。某猪他去年联赛当场写出 $O(n^23^n)$ 的做法,而我至今做出了这个做法,却懒得去做更好的。

  写到这里不禁让我想起某猪。Orz

  写到这里不禁让我想起某猪。我的洛谷本题提交记录的最前面永远的留下了他的代码,永远的留下了当年赌NOIP分数吃全家桶的记忆……

  写道这里,我不禁想起当年那些又吵又闹有骂有笑有他和他的开心的时光。

  写到这里,我又想起了当年天真的笑容们。过去的都过去了,他是否仍然是他?但愿如此,愿他一路顺风。

  不写下去了,不再憋着那泪,空自伤心罢。

代码

  !!!!!本代码在洛谷被卡常,需要开 $O2$ 才可以通过。!!!!!

#include <bits/stdc++.h>
using namespace std;
const int N=12,S=1<<N;
int n,m,g[N][N];
int s,sit[S][S],t[S];
int dp[N][N][S];
int DP(int x,int d,int s){
int &v=dp[x][d][s];
if (~v)
return v;
if (s==0)
return v=0;
v=1e9;
for (int i=1;i<t[s];i++){
int s1=sit[s][i],a=1e9;
for (int j=0;j<n;j++)
if (((s1>>j)&1)&&g[x][j]<1e9)
a=min(a,DP(j,d+1,s1^(1<<j))+(d+1)*g[x][j]);
v=min(v,a+DP(x,d,s^s1));
}
return v;
}
int main(){
scanf("%d%d",&n,&m);
for (int i=0;i<n;i++)
for (int j=0;j<n;j++)
g[i][j]=1e9;
while (m--){
int a,b,c;
scanf("%d%d%d",&a,&b,&c),a--,b--;
g[a][b]=g[b][a]=min(g[a][b],c);
}
s=1<<n;
for (int i=0;i<s;i++)
for (int j=0;j<s;j++)
if ((i|j)==i)
sit[i][t[i]++]=j;
memset(dp,-1,sizeof dp);
int ans=1e9;
for (int i=0;i<n;i++)
ans=min(ans,DP(i,0,(s-1)^(1<<i)));
printf("%d",ans);
return 0;
}

  

NOIP2017提高组Day2T2 宝藏 洛谷P3959 状压dp的更多相关文章

  1. NOIP2017提高组Day2T3 列队 洛谷P3960 线段树

    原文链接https://www.cnblogs.com/zhouzhendong/p/9265380.html 题目传送门 - 洛谷P3960 题目传送门 - LOJ#2319 题目传送门 - Vij ...

  2. 【noip2016提高组day2T3】【愤怒的小鸟】状压dp转移时的集合包含

    (上不了p站我要死了,图来自百度,侵权度娘背锅) 调死我了... 标题就说明了,死在了集合包含上.因为这道题与其他的状压题不同,其他的题基本上都是要求集合不重合,而这道题完全是可以的. 废话不多说,先 ...

  3. P1433 吃奶酪(洛谷)状压dp解法

    嗯?这题竟然是个绿题. 这个题真的不(很)难,我们只是不会计算2点之间的距离,他还给出了公式,这个就有点…… 我们直接套公式去求出需要的值,然后普通的状压dp就可以了. 是的状压dp. 这个题的数据加 ...

  4. [NOIP2013 提高组] 华容道 P1979 洛谷

    [NOIP2013 提高组] 华容道 P1979 洛谷 强烈推荐,更好的阅读体验 经典题目:spfa+bfs+转化 题目大意: 给出一个01网格图,和点坐标x,y空格坐标a,b,目标位置tx,ty要求 ...

  5. NOIP2017 宝藏 题解报告【状压dp】

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

  6. NOIP 2016 提高组 复赛 Day2T1==洛谷2822 组合数问题

    题目描述 组合数表示的是从n个物品中选出m个物品的方案数.举个例子,从(1,2,3) 三个物品中选择两个物品可以有(1,2),(1,3),(2,3)这三种选择方法.根据组合数的定 义,我们可以给出计算 ...

  7. NOIP2018&2013提高组T1暨洛谷P5019 铺设道路

    题目链接:https://www.luogu.org/problemnew/show/P5019 花絮:普及蒟蒻终于A了一道提高的题目?emm,写一篇题解纪念一下吧.求过! 分析: 这道题我们可以采用 ...

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

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

  9. 洛谷P3959 [NOIP2017]宝藏

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

随机推荐

  1. encoding and Endian

    Unicode, Code Point is the value of evry character in Unicode table(int,long,ll) Unicode defines a c ...

  2. CF 545C

    题意: 砍树, 树会向左或者向右倒,数不能倒重叠, 问最多可以砍多少树 思路: 贪心 + Dp吧, 树要尽可能网左倒,这样对后面的树影响较小, 才是最优状态 #include<iostream& ...

  3. input错误提示,点击提交,提示有未填项,屏幕滑到input未填项的位置

    function errorInfo(parm) { //获取文本框值 var $val = parm.val(); if ($val==""||undefined||null){ ...

  4. 洛谷P4707 重返现世 [DP,min-max容斥]

    传送门 前置知识 做这题前,您需要认识这个式子: \[ kthmax(S)=\sum_{\varnothing\neq T\subseteq S}{|T|-1\choose k-1} (-1)^{|T ...

  5. 解决Navicat连接MySQL总是报错1251的方法

    今天下了个 MySQL8.0,发现Navicat连接不上,总是报错1251: 原因是MySQL8.0版本的加密方式和MySQL5.0的不一样,连接会报错. 试了很多种方法,终于找到一种可以实现的: 更 ...

  6. Java语法基础常见疑惑解答8,16,17,21图片补充

    8. 16. 17. 21

  7. tail -f -n 0 /var/log/messages

    <pre><font color="#CC0000"><b>root@kali</b></font>:<font ...

  8. CF1019C

    好玄学的东西... 核心思想:for循环! 首先,我们从前向后扫所有的点,如果这个点没被标记成不可用就把这个点标记成已使用,然后把所有与这个点直接相连的点标记成不可用 接下来,我们从后向前扫所有的点, ...

  9. Django入门基础详解

    本次使用django版本2.1.2 安装django 安装最新版本 pip install django 安装指定版本 pip install django==1.10.1 查看本机django版本 ...

  10. 编程语言,执行python程序,变量(命名规范)

    编程语言 分类: ​ 计算语言/汇编语言/高级语言 计算语言: ​ 站在计算机的角度,说计算机能听懂的语言,就是直接用二进制编程,直接操作硬件 优点是最底层,执行速度最快 缺点是最复杂,开发效率最低 ...