bzoj3836
状压dp
图上怎么跑dp?我们跑三进制状压dp,0表示选了,1表示既没选也没覆盖,2表示没选但是被覆盖了。
状态是dp[dep][S]表示当前走到了深度为dep的节点,状态为S,按照dfs序转移
每次转移就是计算这个点选了没选,然后像树形dp一样更新节点
返祖边也要处理
#include<bits/stdc++.h>
using namespace std;
const int N = 5e4 + ;
int n, m, ans;
vector<int> G[N];
int dp[][N], c[N], vis[N], bin[], st[N], d[N];
inline int rd()
{
int x = , f = ; char c = getchar();
while(c < '' || c > '') { if(c == '-') f = -; c = getchar(); }
while(c >= '' && c <= '') { x = x * + c - ''; c = getchar(); }
return x * f;
}
int bit(int S, int t)
{
return S / bin[t] % ;
}
void dfs(int u, int dep)
{
vis[u] = ;
d[u] = dep;
if(!dep)
{
dp[][] = c[u];
dp[][] = ;
dp[][] = 1e9;
}
else
{
int top = ;
for(int i = ; i < G[u].size(); ++i)
{
int v = G[u][i];
if(d[v] < d[u] && vis[v]) st[++top] = d[v];
}
for(int i = ; i < bin[dep + ]; ++i) dp[dep][i] = 1e9;
for(int i = ; i < bin[dep]; ++i)
{
int U = , V = i;
for(int j = ; j <= top; ++j) if(bit(i, st[j]) == ) U = ; else if(bit(i, st[j]) == ) V += bin[st[j]];
dp[dep][i + U * bin[dep]] = min(dp[dep][i + U * bin[dep]], dp[dep - ][i]);
dp[dep][V] = min(dp[dep][V], dp[dep - ][i] + c[u]);
}
}
for(int i = ; i < G[u].size(); ++i)
{
int v = G[u][i];
if(vis[v]) continue;
dfs(v, dep + );
for(int j = ; j < bin[dep + ]; ++j) dp[dep][j] = min(dp[dep + ][j], dp[dep + ][j + * bin[dep + ]]);
}
}
int main()
{
n = rd();
m = rd();
bin[] = ;
for(int i = ; i <= ; ++i) bin[i] = bin[i - ] * ;
for(int i = ; i <= n; ++i) c[i] = rd();
for(int i = ; i <= m; ++i)
{
int u = rd(), v = rd();
G[u].push_back(v);
G[v].push_back(u);
}
for(int i = ; i <= n; ++i) if(!vis[i])
{
dfs(i, );
ans += min(dp[][], dp[][]);
}
printf("%d\n", ans);
return ;
}
bzoj3836的更多相关文章
- BZOJ3836 [Poi2014]Tourism 【树形dp +状压dp】
题目链接 BZOJ3836 题解 显然这是个\(NP\)完全问题,此题的解决全仗任意两点间不存在节点数超过10的简单路径的性质 这意味着什么呢? \(dfs\)树深度不超过\(10\) \(10\)很 ...
- BZOJ3836 : [Poi2014]Tourism
对于一个连通块,取一个点进行dfs,得到一棵dfs搜索树,则这棵树的深度不超过10,且所有额外边都是前向边. 对于每个点x,设S为三进制状态,S第i位表示根到x路径上深度为i的点的状态: 0:选了 1 ...
- OI动态规划&&优化 简单学习笔记
持续更新!! DP的难点主要分为两类,一类以状态设计为难点,一类以转移的优化为难点. DP的类型 序列DP [例题]BZOJ2298 problem a 数位DP 常用来统计或者查找一个区间满足条件的 ...
- POI2014题解
POI2014题解 [BZOJ3521][Poi2014]Salad Bar 把p当作\(1\),把j当作\(-1\),然后做一遍前缀和. 一个合法区间\([l,r]\)要满足条件就需要满足所有前缀和 ...
随机推荐
- shell(1):网络配置、BATH环境和通配符
一.临时配置网络(ip,网关,dns) ifconfig查看网络配置 修改ip地址 ifconfig ens33 192.168.255.129/24 ens33网卡名称.192.168.255.1 ...
- LNMPA遇到504 Gateway time-out错误的解决方法
Nginx的特点是处理静态很给力,Apache的特点是处理动态很稳定,两者结合起来便是LNMPA,nginx处理前端,apache处理后端,这样处理静态会很快,处理动态会很稳定. 当我以为安装完成以后 ...
- Python+Selenium框架设计--- Page Object Model
POM(Page Object Model):页面对象模型,POM是一种最近几年非常流行的自动化测试模型,或者思想,POM不是一个框架,就是一个解决问题的思想.采用POM的目的,是为了解决前端中UI变 ...
- Spark技术内幕: Task向Executor提交的源代码解析
在上文<Spark技术内幕:Stage划分及提交源代码分析>中,我们分析了Stage的生成和提交.可是Stage的提交,仅仅是DAGScheduler完毕了对DAG的划分,生成了一个计算拓 ...
- caffe搭建--缺少 skimage-缺少 google.protobuf.internal.-caffe搭建--ipython--ubuntu16.04+ caffe+ ipython
mkdir build && cd build cmake .. make pycaffe -j4 sudo vim /etc/profile---- export PYTHONPAT ...
- Webview页面的控件元素定位
前言 现在有很多App都是Hybrid的,即有原生的页面又有Webview的页面,元素的可以通过uiautomatorviewer工具 进行控件元素的定位,Webview页面的则无法通过此方式定位,而 ...
- ReboletricSample工程搭建
受到 Just Say No to More End-to-End Tests 文章链接:http://googletesting.blogspot.tw/2015/04/just-say-no-t ...
- 记录一次在 VirtualBox的添加共享windows文件后,发现没有共享文件的事
在VirtualBox设置完桥接添加ip后,在设备中添加共享windows文件,“e:\work ”,发现共享目录没有文件.使用了各种reboot之后,还是没有发现共享文件夹,重新设置还是不行,用mo ...
- Android UI经常使用实例 怎样实现欢迎界面(Splash Screen)
在Android平台下.下载一个应用后,首次打开映入眼帘的便是Splash Screen,暂且不说Android的设计原则提不提倡这样的Splash Screen.先来看看一般使用Splash Scr ...
- Jquey模糊选择
Jquey模糊选择 属性字头选择器(Attribute Contains Prefix Selector): jQuery 属性字头选择器的使用格式是 jQuery(‘[attribute|=va ...