BZOJ.3058.四叶草魔杖(Kruskal 状压DP)
\(2^{16}=65536\),可以想到状压DP。但是又有\(\sum A_i\neq 0\)的问题。。
但是\(2^n\)这么小,完全可以枚举所有子集找到\(\sum A_i=0\)的,先使这整个子集内满足平衡,求一棵最小生成树就一定可以了。
这样可能会不最优,我们可以用更小的子集(小的话还是最优的)去更新大的。
还需要合并这些子集。将任意两个\(\sum A_i=0\)的子集都是合法的,且会更新到所有情况。
\(2^n\times 2^n\)枚举\(\sum A_i=0\)的子集。。这个数量到不了\(2^{16}\),常数也很小。(反正我知道它能A)
//1080kb 40ms
#include <cstdio>
#include <cctype>
#include <algorithm>
#define gc() getchar()
const int N=(1<<16)+1,M=250,INF=0x3f3f3f3f;
int n,m,A[20],fa[20],f[N];
struct Edge{
int fr,to,cost;
bool operator <(const Edge &x)const{
return cost<x.cost;
}
}e[M];
inline int read()
{
int now=0,f=1;register char c=gc();
for(;!isdigit(c);c=='-'&&(f=-1),c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now*f;
}
int Get_fa(int x){
return x==fa[x]?x:fa[x]=Get_fa(fa[x]);
}
int Kruskal(int s)
{
int cnt=0;
for(int i=0; i<n; ++i)
if(s>>i&1) fa[i]=i, ++cnt;
int res=0; --cnt;
for(int r1,r2,i=1; i<=m; ++i)
{
if(!(s>>e[i].fr&1)||!(s>>e[i].to&1)) continue;
if((r1=Get_fa(e[i].fr))==(r2=Get_fa(e[i].to))) continue;
fa[r1]=r2, res+=e[i].cost;
if(!--cnt) break;
}
return cnt?INF:res;//生成树可能构不成!
}
int main()
{
n=read(), m=read();
for(int i=0; i<n; ++i) A[i]=read();
for(int i=1; i<=m; ++i) e[i].fr=read(),e[i].to=read(),e[i].cost=read();
std::sort(e+1,e+1+m);
int lim=(1<<n)-1;
for(int s=1; s<=lim; ++s)
{
int sum=0;
for(int i=0; i<n; ++i) if(s>>i&1) sum+=A[i];
if(sum) f[s]=INF;
else f[s]=Kruskal(s);
}
for(int s1=1; s1<=lim; ++s1)
{
if(f[s1]==INF) continue;
for(int s2=1; s2<=lim; ++s2)
{
if(f[s2]==INF||s1&s2) continue;
f[s1|s2]=std::min(f[s1|s2],f[s1]+f[s2]);
}
}
if(f[lim]==INF) puts("Impossible");//Impossible打错WA三遍→_→(倒找出俩错)
else printf("%d\n",f[lim]);
return 0;
}
BZOJ.3058.四叶草魔杖(Kruskal 状压DP)的更多相关文章
- BZOJ_3058_四叶草魔杖_kruscal+状压DP
BZOJ_3058_四叶草魔杖_kruscal+状压DP Description 魔杖护法Freda融合了四件武器,于是魔杖顶端缓缓地生出了一棵四叶草,四片叶子幻发着淡淡的七色光.圣剑护法rainbo ...
- [tyvj2054] 四叶草魔杖 (最小生成树 状压dp)
传送门 Background 陶醉在彩虹光芒笼罩的美景之中,探险队员们不知不觉已经穿过了七色虹,到达了目的地,面前出现了一座城堡和小溪田园,城堡前的木牌上写着"Poetic Island&q ...
- tyvj 2054 [Nescafé29]四叶草魔杖——最小生成树+状压dp
题目:http://www.joyoi.cn/problem/tyvj-2054 枚举点集,如果其和为0,则作为一个独立的块求一下最小生成树.因为它可以不和别的块连边. 然后状压dp即可. 别忘了判断 ...
- BZOJ.4145.[AMPPZ2014]The Prices(状压DP)
BZOJ 比较裸的状压DP. 刚开始写麻烦惹... \(f[i][s]\)表示考虑了前\(i\)家商店,所买物品状态为\(s\)的最小花费. 可以写求一遍一定去\(i\)商店的\(f[i]\)(\(f ...
- bzoj 5299: [Cqoi2018]解锁屏幕 状压dp+二进制
比较简单的状压 dp,令 $f[S][i]$ 表示已经经过的点集为 $S$,且最后一个访问的位置为 $i$ 的方案数. 然后随便转移一下就可以了,可以用 $lowbit$ 来优化一下枚举. code: ...
- BZOJ 4197: [Noi2015]寿司晚宴 状压dp+质因数分解
挺神的一道题 ~ 由于两个人选的数字不能有互质的情况,所以说对于一个质因子来说,如果 1 选了,则 2 不能选任何整除该质因子的数. 然后,我们发现对于 1 ~ 500 的数字来说,只可能有一个大于 ...
- BZOJ 3864 Hero meet devil (状压DP)
最近写状压写的有点多,什么LIS,LCSLIS,LCSLIS,LCS全都用状压写了-这道题就是一道状压LCSLCSLCS 题意 给出一个长度为n(n<=15)n(n<=15)n(n< ...
- bzoj 3195 奇怪的道路 状压dp
看范围,状压没毛病 但是如果随便连的话给开1<<16,乘上n,m就爆了 所以规定转移时只向回连边 于是想状态数组:f[i][j]表示到i这里i前K位的状态为j(表示奇偶) 发现有条数限制, ...
- bzoj 1556: 墓地秘密【状压dp+spfa】
显然是状压,显然不可能把所有格子压起来 仔细观察发现只有机关周围的四个格子有用以及起点,所以我们用spfa处理出这些格子两两之间的距离(注意细节--这里写挂了好几次),然后设f[s][i]为碰完的机关 ...
随机推荐
- [转载]Brackets - 强大免费的开源跨平台Web前端开发工具IDE (HTML/CSS/Javascript代码编辑器)
http://brackets.io/ Brackets 是一个免费.开源且跨平台的 HTML/CSS/JavaScript 前端 WEB 集成开发环境 (IDE工具).该项目由 Adobe 创建和维 ...
- [整理]javascript压缩、格式化
1.使用packer来压缩JS文件 packer工具在线版:http://dean.edwards.name/packer/ 通过packer对js打包压缩的同时,执行Base62 encode编码后 ...
- ASP.NET MVC3-Music Store中英文教程 [下载]
翻译原文档名: MVC Music Store版本: ASP.NET MVC3概述Mvc Music Store 是一个为WEB开发人员一步一步介绍和解释如何使用MVC和Visual Web开发的应用 ...
- AngularJS入门基础——表单验证
<form name="form" novalidata> <label name="email">your email</l ...
- iOS编码规范参考
目录 注释 1.1 多行注释 1.2 单行注释 1.3 函数的注释 命名 2.1 常量的命名 2.2 函数的命名 2.3 变量的命名 2.3.1 成员变量 2.3.2 公 ...
- 由于找不到MSVCP20.dll,无法继续执行代码
系统:win10 专业版,刚升级win10没几天 mysql 5.7.21 解压安装,初始化时报错,错误如图: 一.查找错误原因 参考:MySQL安装使用遇到的问题, 找到微软中文官方网站,搜索 ms ...
- 数链剖分(Housewife Wind )
题目链接:https://vjudge.net/contest/279350#problem/B 题目大意:给你n,q,s.n指的是有n个点,q代表有q次询问,s代表的是起点.然后接下来会有n-1条 ...
- c++ 函数指针简单实例
一开始看函数指针的时候我是很懵的,因为不知道它有什么用,之后慢慢就发现了自己的愚昧无知. 假设我们想实现一个数据结构,比如二叉搜索树,堆.又或者是一个快排,归并排序. 我们一般是直接在两个数要比较的时 ...
- 【Python】Flask系列-URL和视图笔记
1.学习目标 熟悉Flask相关知识. 熟悉web开发流程. 能独立开发Flask项目. 2.环境配置 Python虚拟环境安装 因为python的框架更新迭代太快了,有时候需要在电脑上存在一个框架的 ...
- 爬虫、框架scrapy
阅读目录 一 介绍 二 安装 三 命令行工具 四 项目结构以及爬虫应用简介 五 Spiders 六 Selectors 七 Items 八 Item Pipeline 九 Dowloader Midd ...