\(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&#233;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]为碰完的机关 ...
随机推荐
-
关于 UINavigationController 的一些知识
1.在 UINavigationController 中,添加一个UITextView,虽然设置self.frame = textView.bounds(从0.0开始),但是系统会自动设置一个cont ...
-
Nginx日志定时切割脚本
nginx的日志文件如果你不处理,将变得越来越大,我们可以写一个nginx日志切割脚本来自动切割日志文件. 第一步就是重命名日志文件,不用担心重命名后nginx找不到日志文件而丢失日志.在你未重新打开 ...
-
[tty与uart]理解线路规程的作用
转自:http://biancheng.dnbcw.info/linux/336240.html Linux OS的设备驱动有相当经典的抽象思想以及分层思想.与通信世界里面的思想相一致. 一.在Lin ...
-
为什么要使用`QuerySet.iterator()`
用django的custom command功能,写了一个脚本,目的是修正生成环境的数据,tqdm告诉我运行时长预估是2小时. 一个小时后,正在吃午饭的我,接到了很多微信推送.客户告诉我服务不可用,同 ...
-
pandas文件写入读取操作
#encoding:utf8 import pandas as pd import numpy as np from pylab import * df=pd.read_csv("./pat ...
-
angular 我看过的技术书籍
13年我在悠唐网络做前端开发时,当时仿豌豆荚一个sdk 发布应用界面的时候,看到代码用到奇怪的ng-,当时查了下是用angular,从那时开始慢慢接触angular,之后进入逸橙官网组使用angula ...
-
Revit MEP API找到连接器连接的连接器
通过conn.AllRefs;可以找到与之连接的连接器. //连接器连接的连接器 [TransactionAttribute(Autodesk.Revit.Attributes.Transaction ...
-
ORA-10922 Temporary tablespace group is empty错误
错误--练习查询,发现报错: SQL> select * from range_list_part_tab where id=100000Execution Plan------------- ...
-
ES6的新特性(1)——ES6 的概述
ES6 的概述 首先,感谢马伦老师的ES6新特性的教程. ECMAScript 和 JavaScript 的关系是 ECMAScript 和 JavaScript 的关系是,前者是后者的规格,后者是前 ...
-
PHP之冒号、endif、endwhile、endfor 是什么鬼?f
解释:其实这些都是PHP的语法,只不过不常用而已,这些都是PHP流程控制的替代语法. 冒号(:)相当于是 左大括号---->{ endif.endwhile.endfor.endforeach- ...