noip2017d2t2
看数据范围想到状压,我们知道最后是选出一颗生成树,但边权的计算有一些有趣;
我们先选一个点做根;然后就发现边的权和深度有关;那我们按深度dp;即按层dp;
dp[i][s]表示前i层选的点集为s,转移时我们枚举s的补集的子集ss;对于ss中的每个点,
我们连上他到s中点的最小边;但这样连的边没办法保证深度为i+1,但我们就强制把他设成i+1;
这样感觉很错,但其实是对的,因为这样只会使答案变大,而且还可以保证真正的答案被枚举到;
相当于是一种对限制的扩大。
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdio>
using namespace std;
typedef long long ll;
const ll inf=1e16;
ll map[][],dis[][(<<)+];
ll dp[][(<<)+],z;
int n,m,x,y;
int main(){
cin>>n>>m;
if(!m){puts("");return ;}
for(int i=;i<=;++i)
for(int j=;j<=;++j)map[i][j]=inf;
for(int i=;i<=;++i)
for(int j=;j<=(<<);++j)dis[i][j]=inf;
for(int i=;i<=;++i)
for(int j=;j<=(<<);++j)dp[i][j]=inf;
for(int i=;i<=m;++i){
scanf("%d%d%d",&x,&y,&z);
map[x][y]=map[y][x]=min(map[x][y],z);
}
int sta=(<<n)-;
for(int s=;s<=sta;++s){
for(int i=;i<=n;++i){
if((<<(i-))&s)continue;
for(int j=;j<=n;++j){
if((<<(j-))&s)dis[i][s]=min(dis[i][s],map[i][j]);
}
}
}
for(int i=;i<=n;++i)dp[][<<(i-)]=;
for(int s=;s<=sta;++s){
int st=sta-s;
for(int ss=st;ss;ss=(ss-)&st){
ll res=;
for(int i=;i<=n;++i){
if((<<(i-))&ss)res+=dis[i][s];
}
for(ll i=;i<n;++i){
dp[i+][ss|s]=min(dp[i+][ss|s],dp[i][s]+res*i);
}
}
}
ll ans=inf;
for(int i=;i<=n;++i)ans=min(ans,dp[i][sta]);
cout<<ans;
return ;
}
noip2017d2t2的更多相关文章
- NOIp2017D2T2(luogu3959) 宝藏 (状压dp)
时隔多年终于把这道题锅过了 数据范围显然用搜索剪枝状压dp. 可以记还有哪些点没到(或者已到了哪些点).我们最深已到的是哪些点.这些点的深度是多少,然后一层一层地往下推. 但其实是没必要记最深的那一层 ...
- 【状压DP】【P3959】【NOIP2017D2T2】宝藏
Description 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 $n$ 个深埋在地下的宝藏屋, 也给出了这 $n$ 个宝藏屋之间可供开发的$ m$ 条道路和它们的长度. 小明决心亲自前往挖 ...
随机推荐
- sFlow-rt安装部署
sFlow技术是一种以设备端口为基本单元的数据流随机采样的流量监控技术,不仅可以提供完整的第二层到第四层甚至全网范围内的实时流量信息,而且可以适应超大网络流量(如大于10Gbit/s)环境下的流量 ...
- kvm介绍 转载
KVM 介绍(1):简介及安装 学习 KVM 的系列文章: (1)介绍和安装 (2)CPU 和 内存虚拟化 (3)I/O QEMU 全虚拟化和准虚拟化(Para-virtulizaiton) (4)I ...
- Android.Tools.Summary
Android平台上工具的总结 每个工具的详细使用和深入理解参考每个工具相关的blog. 1. Android SDK中提供的工具 http://developer.android.com/tools ...
- c++课设学生成绩与学籍管理系统
题目要求(手打,累):设计一个类CStudent,类中包含一个学生的基本数据如下: 编号,姓名,性别,年龄,数学成绩,计算机成绩,外语成绩. 并假设编号为整数,且从1号往后连续编码:姓名为字符串,性别 ...
- readv writev示例程序
当 readv() 时候,需要程序自己提供space,接收数据. #include <stdio.h> #include <stdlib.h> #include <str ...
- vitas高音
http://music.163.com/#/song/19674656?userid=65416848
- VB.NET中的DLL编写和调用的最简单示例
DLL(动态链接库)是一个很有用的东西,在开发大项目的时候显得非常重要,因为多人合作开发时,可以给每个人分配一个任务,用DLL完成,最后组合起来,就不会出现互相冲突的问题.这里给出最简单的DLL编写与 ...
- 10个相见恨晚的 Java 在线练手项目
10个有意思的Java练手项目: 1.Java 开发简单的计算器 难度为一般,适合具有 Java 基础和 Swing 组件编程知识的用户学习 2.制作一个自己的 Java 编辑器 难度中等,适合 Ja ...
- QT5中无法包含Qtgui头文件的问题。
今天新学QT是,从一个ppt中边看边抄边学.前几页还能理解,但到了用纯源码写空白QT工程时,便遇到了一个问题.头文件里包含 #include <QtGui> 但是编译时总是出现下面图一中 ...
- 苹果电脑thunderbolt连接两台电脑启动方法
thunderbolt:首先连接连台电脑 然后开启可以启动的电脑, 关闭无法启动的电脑. 接着 按一下法启动的电脑电源—> 然后按t键 会在另外一台可以启动的电脑上出现,无法启动电脑的磁盘. 就 ...