题目

选定一个起点 \(S\),找到一棵生成树,最小化

\[\sum_{i=1}^n dep_i\times dis_i
\]

\(n\leq 12\)


分析

设 \(dp[d][S]\) 表示当前树中点的状态为 \(S\) ,并且树高为 \(d\) 的最小值,则

\[dp[d][S_0|S_1]=\min\{dp[d-1][S_0]+d*f[S_0][S_1]\},S_0\cap S_1=\empty
\]

这个直接枚举子集可以做到 \(O(n3^n)\)

再看两个集合互相连边最小值 \(f\),这个可以通过枚举新的节点同样做到 \(O(n3^n)\)


代码

#include <cstdio>
#include <cctype>
#define rr register
using namespace std;
const int N=4096,M=12; int cho[N],b[N];
int two[M],dis[M][M],d[M],dp[2][N],f[N][N],n,m,al,ans;
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline signed min(int a,int b){return a<b?a:b;}
signed main(){
n=iut(),m=iut(),al=(1<<n)-1,two[0]=1,ans=1e8;
if (n==1) return !putchar(48);
for (rr int i=1;i<n;++i) two[i]=two[i-1]<<1;
for (rr int i=0;i<n;++i) cho[two[i]]=i;
for (rr int i=0;i<n;++i)
for (rr int j=0;j<n;++j) dis[i][j]=1e8;
for (rr int i=1;i<=m;++i){
rr int x=iut()-1,y=iut()-1,w=iut();
dis[x][y]=dis[y][x]=min(dis[x][y],w);
}
for (rr int _S=0;_S<=al;++_S){
rr int S=al^_S,tot=0;
for (rr int j=0;j<n;++j) d[j]=1e8,dp[0][_S]=1e8;
for (rr int k=0;k<n;++k) if ((_S>>k)&1)
for (rr int j=0;j<n;++j) d[j]=min(d[j],dis[j][k]);
for (rr int j=S;j;) b[tot++]=j,j=(j-1)&S;
for (rr int j=tot-1;~j;--j)
f[_S][b[j]]=f[_S][b[j]&(b[j]-1)]+d[cho[-b[j]&b[j]]];
}
for (rr int i=0;i<n;++i) dp[0][two[i]]=0;
for (rr int i=1;i<n;++i){
for (rr int _S=0;_S<=al;++_S) dp[i&1][_S]=1e8;
for (rr int _S=1;_S<=al;++_S) if (dp[(i&1)^1][_S]<1e8){
rr int S=al^_S;
for (rr int j=S;j;j=(j-1)&S)
dp[i&1][_S^j]=min(dp[i&1][_S^j],dp[(i&1)^1][_S]+i*f[_S][j]);
}
ans=min(ans,dp[i&1][al]);
}
return !printf("%d",ans);
}

#状压dp#洛谷 3959 [NOIP2017 提高组] 宝藏的更多相关文章

  1. 洛谷 3953 NOIP2017提高组Day1 T3 逛公园

    [题解] 先建反向图,用dijkstra跑出每个点到n的最短距离dis[i] 设f[u][k]表示dis(u,n)<=mindis(u,n)+k的方案数.对于边e(u,v,w),走了这条边的话需 ...

  2. 【洛谷】NOIP提高组模拟赛Day2【动态开节点/树状数组】【双头链表模拟】

    U41571 Agent2 题目背景 炎炎夏日还没有过去,Agent们没有一个想出去外面搞事情的.每当ENLIGHTENED总部组织活动时,人人都说有空,结果到了活动日,却一个接着一个咕咕咕了.只有不 ...

  3. NOIP2017[提高组] 宝藏 题解

    解析 我们观察范围可以发现n非常的小,(一般来说不是搜索就是状压dp)所以说对于这题我们可以用记忆化搜索或者dp,我们发现起点不同那么最终答案也就不同,也就是说答案是跟起点有关的,于是我们便可以想到去 ...

  4. 洛谷P1514 [NOIP2010提高组T4]引水入城

    P1514 引水入城 题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城 ...

  5. 洛谷P1006 NOIP提高组2008 传纸条

    P1006 传纸条 题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n 列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无 ...

  6. 【模板】LIS模板 洛谷P1091 [NOIP2004提高组]合唱队形 [2017年4月计划 动态规划11]

    以题写模板. 写了两个:n^2版本与nlogn版本 P1091 合唱队形 题目描述 N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形. 合唱队形是指这样的一种队 ...

  7. 洛谷 P2678 & [NOIP2015提高组] 跳石头

    题目链接 https://www.luogu.org/problemnew/show/P2678 题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布 ...

  8. 洛谷 P1025 & [NOIP2001提高组] 数的划分(搜索剪枝)

    题目链接 https://www.luogu.org/problemnew/show/P1025 解题思路 一道简单的dfs题,但是需要剪枝,否则会TLE. 我们用dfs(a,u,num)来表示上一个 ...

  9. 洛谷P1084 [NOIP2012提高组Day2T3]疫情控制

    P1084 疫情控制 题目描述 H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都,也是树中的根节点. H 国的首都爆发了一种危害性极高的传染病.当局为了控 ...

  10. 洛谷P1083 [NOIP2012提高组Day2T2]借教室

    P1083 借教室 题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借 ...

随机推荐

  1. win32 - PE Executable and section inject

    #include <iostream> #include <Windows.h> #include <ShlObj.h> #include <Shlwapi. ...

  2. RabbitMQ和RPC

    消息队列 消息队列中间件 (Message Queue Middleware,简称 MQ) 是指利用高效可靠的消息传递机制进行与平台无关的数据交流,它可以在分布式环境下扩展进程间的数据通信,并基于数据 ...

  3. 【算法day2】复杂度和简单排序算法(2)

    插入排序 有以下数组 数组:[2,4,3,6,1] 序号:[0,1,2,3,4] 第一次排序(范围0~0):2左边没东西,不动 第二次排序(范围0~1):4左边是2,4大不动 第三次排序(范围0~2) ...

  4. 【LeetCode数组#2双指针法】移除元素、删除有序数组中的重复项、移动0

    移除元素 力扣27题目链接(opens new window) 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度. 不要使用额外的数组 ...

  5. linux 命令行使用codeql

    目录 CodeQL 概述 安装 直接使用在线查询(lgtm) vscode使用codeql 下载 库文件 测试 linux控制台运行 下载 安装 创建数据库 编写QL查询数据库 简单解释 CodeQL ...

  6. POM模式核心思想?

    对页面元素进行封装为类的属性 对用例执行流程设计成类的实例方法 通过定义好的页面类实例化一个对象,通过对象调用实例方法执行用例 核心作用: 可以较少代码的冗余,方便后面维护,如果页面元素发生改变, 只 ...

  7. 11 .Codeforces Round 891 (Div. 3)E. Power of Points(推公式+前缀和优化)

    E. Power of Points 题解参考 #include <bits/stdc++.h> #define int long long #define rep(i, a, b) fo ...

  8. .NET集成DeveloperSharp实现数据分页

    数据分页,几乎是任何应用系统的必备功能.但当数据量较大时,分页操作的效率就会变得很低.大数据量分页时,一个操作耗时5秒.10秒.甚至更长时间都是有可能的,但这在用户使用的角度是不可接受的-- 数据分页 ...

  9. css 布局整理2022-4

    理解CSS3里的Flex布局用法(转自网上,博客园修改一些方便更易看懂) 简单有法: 几个横排元素在竖直方向上居中 display: flex; flex-direction: row;//横向排列 ...

  10. maven打包出现 ����applets.user.service.UserService����-2022新项目

    一.问题由来 新项目的框架刚搭建好,还不能正常的运行,我们这边就开始写代码,因为项目还在设计阶段,很多东西比如说需求 都还在讨论之中.分层架构采用的是cola4.0的架构,具体的代码由我们自己来进行实 ...