题目链接

题目链接

题解

一开始想了一个错误的状压dp,水了40分。

这里先记录一下错误的做法:

错解:

设\(g[i,j,S]\)从\(i\)到\(j\),只经过集合\(S\)中的点的最短路,这个可以\(O(n^3 2 ^ n)\)处理出来。

设\(f[S]\)表示生成树的集合为\(S\)时的最小代价,每次枚举起点,以及新加入生成树的点,利用\(g\)数组可以\(O(1)\)算出来\(K\)。总复杂度是\(O(n^3 2^n)\)

那么为什么错了呢?因为\(g[i,j,S]\)是一个点集内互达的点的\(\min\),其涉及到的边集远大于生成树的边集,所以相当于利用了很多没有选的边来减少\(K\),所以算出来的\(K\)是错误的。

正解:

设\(g[S]\)表示从集合\(S\)内的点出发,只走一条边可到达的点集(包括集合\(S\)内的点)。这个可以\(O(n^2 2^n)\)处理。

设\(f[i,S]\)为生成树最大树高为\(i\),目前生成树集合为\(S\)的最小代价。

我们枚举\(S\)的子集\(S0\),设其在\(S\)为全集时的补集为\(S1\),那么当\(g[S0]|S=g[S0]\)时(即通过\(S0\)的中的点可以到达当前集合\(S\)中全部的点),\(f[i][S]=\min\{f[i-1][S0]+cost \}\)。\(cost\)即为将\(S1\)与\(S0\)合并为\(S\)的最小代价。

这里有一个很重要的结论,在最优解中,拓展的集合\(S1\)在\(S\)中树高均为\(i\)(\(S0\)中最大树高为\(i-1\))。

考虑证明,假设有一个点\(x(x\in S0)\),有边\(d[y][x]>d[z][x],dep_y<dep_z\),满足\(d[y][x]*(dep_y+1)<d[z][x]*(dep_z+1)\)。

那在当\(y\)为生成树集中的最深点时一定已经拓展到了点\(x\),所以一定有另一状态\(S_2\)可以转移到\(S\)使答案最优。

即最优解中的生成树一定可以按深度拓展。

所以转移时的\(cost\)只需枚举\(S_1\)中的点,求出\(S_1\)到\(S_0\)中的点的\(\min_{dis}\)之和,乘上\(i\),就是这次加边的\(cost\)。

初始化\(f[2^k]=0(k\in [0,n-1])\)。答案即为所有集合\(S\)为全集时的\(f\)值的\(\min\)。

不看题解还是不会写...

因为状压枚举子集的复杂度是\(O(3^n)\)。所以总复杂度是\(O(n^2 3 ^n)\)

#include <bits/stdc++.h>
using namespace std; #define ll long long
const int N = 13;
const int inf = 0x3f3f3f3f; int n, m, w[N][N];
int f[N][(1<<N)+10], g[(1<<N)+10]; int main() {
memset(w, 0x3f, sizeof(w));
cin >> n >> m;
for(int u, v, k, i = 1; i <= m; ++i) {
cin >> u >> v >> k;
--u; --v;
w[u][v] = w[v][u] = min(w[u][v], k);
}
for(int S = 1; S < 1 << n; ++S)
for(int i = 0; i < n; ++i)
if((S >> i) & 1) {
w[i][i] = 0; g[S] |= 1 << i;
for(int j = 0; j < n; ++j)
if(w[i][j] != inf) g[S] |= 1 << j;
}
memset(f, 0x3f, sizeof(f));
for(int i = 0; i < n; ++i) f[0][1 << i] = 0;
for(int S = 1; S < 1 << n; ++S) {
for(int S0 = S - 1; S0; S0 = (S0 - 1) & S) {
int S1 = S ^ S0;
int sum = 0;
if((g[S0] | S) == g[S0]) {
for(int i = 0; i < n; ++i) {
if((S1 >> i) & 1) {
int tmp = inf;
for(int j = 0; j < n; ++j) {
if(((S0 >> j) & 1))
tmp = min(tmp, w[i][j]);
}
sum += tmp;
}
}
for(int i = 1; i < n; ++i) { // 树高
if(f[i - 1][S0] != inf)
f[i][S] = min(f[i][S], f[i - 1][S0] + i * sum);
}
}
}
}
int ans = inf;
for(int i = 0; i < n; ++i) ans = min(ans, f[i][(1 << n) - 1]);
printf("%d\n", ans);
}

LGOJP3959 宝藏的更多相关文章

  1. 算法:poj1066 宝藏猎人问题。

    package practice; import java.util.Scanner; public class TreasureHunt { public static void main(Stri ...

  2. 【BZOJ-1924】所驼门王的宝藏 Tarjan缩点(+拓扑排序) + 拓扑图DP

    1924: [Sdoi2010]所驼门王的宝藏 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 787  Solved: 318[Submit][Stat ...

  3. zzulioj 1907小火山的宝藏交易(dfs记忆化搜索)

    #include <stdio.h> #include <algorithm> #include <string.h> #include <vector> ...

  4. codevs3196 黄金宝藏

    题目描述 Description 小毛终于到达宝藏点,他意外地发现有一个外星人(名叫Pluto).宝藏是一些太空黄金,有n堆排成一行,每堆中有xi颗黄金.小毛和Pluto决定轮流从中取出黄金,规则是每 ...

  5. bzoj 1924 [Sdoi2010]所驼门王的宝藏(构图,SCC,DP)

    Description Input 第一行给出三个正整数 N, R, C. 以下 N 行,每行给出一扇传送门的信息,包含三个正整数xi, yi, Ti,表示该传送门设在位于第 xi行第yi列的藏宝宫室 ...

  6. (zzuli)1907 小火山的宝藏收益

    Description 进去宝藏后, 小火山发现宝藏有N个房间,且这n个房间通过N-1道门联通. 每一个房间都有一个价值为Ai的宝藏, 但是每一个房间也都存在一个机关.如果小火山取走了这个房间的宝藏, ...

  7. zzuli 1907: 小火山的宝藏收益 邻接表+DFS

    Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 113  Solved: 24 SubmitStatusWeb Board Description    ...

  8. [SDOI2010]所驼门王的宝藏

    题目描述 在宽广的非洲荒漠中,生活着一群勤劳勇敢的羊驼家族.被族人恭称为"先知"的Alpaca L. Sotomon是这个家族的领袖,外人也称其为"所驼门王". ...

  9. [51nod1474]宝藏图

    有n堆宝藏,每一堆宝藏有一个挖掘所需要的时间ti,有一个价值qi. 现在是做一个宝藏图.这个宝藏图是这样的,宝藏图的形状是一棵二叉树,二叉树刚好有k个叶子结点,从n堆宝藏中选k堆放到二叉树的叶子结点上 ...

随机推荐

  1. JobStorage.Current property value has not been initialized. You must set it before using Hangfire Client or Server API.

    JobStorage.Current property value has not been initialized. You must set it before using Hangfire Cl ...

  2. Linux基础(06)IO复用

    在Windows文件指的就是普通的肉眼可见的文件 , 而Linux一切皆文件 https://blog.csdn.net/nan_nan_nan_nan_nan/article/details/812 ...

  3. python3 安装 pyinstaller 时报错的解决办法

    如上图所示,在安装的过程中发现是所关联的一个 future模块安装失败,庵后我有单独安装了一下这个future,发现还是失败 然后在网上寻找解决办法,最后找到了这个指令,pip install fut ...

  4. 【题解】Luogu P5405 [CTS2019]氪金手游

    原题传送门 我们珂以先考虑一条链的情况,设\(sum\)为所有\(w_i\)的总和,\(Sw_i\)表示\(\sum_{j=i}^nw_i\) \[1 \rightarrow 2 \rightarro ...

  5. sql server 压缩日志文件

    USE [master] GO ALTER DATABASE TestDB SET RECOVERY SIMPLE WITH NO_WAIT GO ALTER DATABASE TestDB SET ...

  6. HBase 系列(三)—— HBase 基本环境搭建

    一.安装前置条件说明 1.1 JDK版本说明 HBase 需要依赖 JDK 环境,同时 HBase 2.0+ 以上版本不再支持 JDK 1.7 ,需要安装 JDK 1.8+ .JDK 安装方式见本仓库 ...

  7. Bash速查表

    例 #!/usr/bin/env bash NAME="John" echo "Hello $NAME!" 变量 NAME="John" e ...

  8. 4.将验证添加到 ASP.NET Core Razor 页面

    向 Movie 模型添加了验证逻辑. 每当用户创建或编辑电影时,都会强制执行验证规则. 1.打开Movie.cs文件.DataAnnotations命名空间提供了一组内置的验证属性,这些属性以声明方式 ...

  9. Vue.js的路由之——vue-router快速入门

    直接先上效果图 这个单页面应用有两个路径:/home和/about,与这两个路径对应的是两个组件Home和About. 整个实现过程 JavaScript 创建组件:创建单页面应用需要渲染的组件 创建 ...

  10. 【TTS】传输表空间AIX asm -> linux asm

    [TTS]传输表空间AIX asm -> linux asm 一.1  BLOG文档结构图       一.2  前言部分   一.2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌 ...