BZOJ.3058.四叶草魔杖(Kruskal 状压DP)

时间:2022-09-29 20:53:26

题目链接

\(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)的更多相关文章

  1. BZOJ&lowbar;3058&lowbar;四叶草魔杖&lowbar;kruscal&plus;状压DP

    BZOJ_3058_四叶草魔杖_kruscal+状压DP Description 魔杖护法Freda融合了四件武器,于是魔杖顶端缓缓地生出了一棵四叶草,四片叶子幻发着淡淡的七色光.圣剑护法rainbo ...

  2. &lbrack;tyvj2054&rsqb; 四叶草魔杖 &lpar;最小生成树 状压dp&rpar;

    传送门 Background 陶醉在彩虹光芒笼罩的美景之中,探险队员们不知不觉已经穿过了七色虹,到达了目的地,面前出现了一座城堡和小溪田园,城堡前的木牌上写着"Poetic Island&q ...

  3. tyvj 2054 &lbrack;Nescaf&&num;233&semi;29&rsqb;四叶草魔杖——最小生成树&plus;状压dp

    题目:http://www.joyoi.cn/problem/tyvj-2054 枚举点集,如果其和为0,则作为一个独立的块求一下最小生成树.因为它可以不和别的块连边. 然后状压dp即可. 别忘了判断 ...

  4. BZOJ&period;4145&period;&lbrack;AMPPZ2014&rsqb;The Prices&lpar;状压DP&rpar;

    BZOJ 比较裸的状压DP. 刚开始写麻烦惹... \(f[i][s]\)表示考虑了前\(i\)家商店,所买物品状态为\(s\)的最小花费. 可以写求一遍一定去\(i\)商店的\(f[i]\)(\(f ...

  5. bzoj 5299&colon; &lbrack;Cqoi2018&rsqb;解锁屏幕 状压dp&plus;二进制

    比较简单的状压 dp,令 $f[S][i]$ 表示已经经过的点集为 $S$,且最后一个访问的位置为 $i$ 的方案数. 然后随便转移一下就可以了,可以用 $lowbit$ 来优化一下枚举. code: ...

  6. BZOJ 4197&colon; &lbrack;Noi2015&rsqb;寿司晚宴 状压dp&plus;质因数分解

    挺神的一道题 ~ 由于两个人选的数字不能有互质的情况,所以说对于一个质因子来说,如果 1 选了,则 2 不能选任何整除该质因子的数. 然后,我们发现对于 1 ~ 500 的数字来说,只可能有一个大于 ...

  7. BZOJ 3864 Hero meet devil &lpar;状压DP&rpar;

    最近写状压写的有点多,什么LIS,LCSLIS,LCSLIS,LCS全都用状压写了-这道题就是一道状压LCSLCSLCS 题意 给出一个长度为n(n<=15)n(n<=15)n(n< ...

  8. bzoj 3195 奇怪的道路 状压dp

    看范围,状压没毛病 但是如果随便连的话给开1<<16,乘上n,m就爆了 所以规定转移时只向回连边 于是想状态数组:f[i][j]表示到i这里i前K位的状态为j(表示奇偶) 发现有条数限制, ...

  9. bzoj 1556&colon; 墓地秘密【状压dp&plus;spfa】

    显然是状压,显然不可能把所有格子压起来 仔细观察发现只有机关周围的四个格子有用以及起点,所以我们用spfa处理出这些格子两两之间的距离(注意细节--这里写挂了好几次),然后设f[s][i]为碰完的机关 ...

随机推荐

  1. 关于 UINavigationController 的一些知识

    1.在 UINavigationController 中,添加一个UITextView,虽然设置self.frame = textView.bounds(从0.0开始),但是系统会自动设置一个cont ...

  2. Nginx日志定时切割脚本

    nginx的日志文件如果你不处理,将变得越来越大,我们可以写一个nginx日志切割脚本来自动切割日志文件. 第一步就是重命名日志文件,不用担心重命名后nginx找不到日志文件而丢失日志.在你未重新打开 ...

  3. &lbrack;tty与uart&rsqb;理解线路规程的作用

    转自:http://biancheng.dnbcw.info/linux/336240.html Linux OS的设备驱动有相当经典的抽象思想以及分层思想.与通信世界里面的思想相一致. 一.在Lin ...

  4. 为什么要使用&grave;QuerySet&period;iterator&lpar;&rpar;&grave;

    用django的custom command功能,写了一个脚本,目的是修正生成环境的数据,tqdm告诉我运行时长预估是2小时. 一个小时后,正在吃午饭的我,接到了很多微信推送.客户告诉我服务不可用,同 ...

  5. pandas文件写入读取操作

    #encoding:utf8 import pandas as pd import numpy as np from pylab import * df=pd.read_csv("./pat ...

  6. angular 我看过的技术书籍

    13年我在悠唐网络做前端开发时,当时仿豌豆荚一个sdk 发布应用界面的时候,看到代码用到奇怪的ng-,当时查了下是用angular,从那时开始慢慢接触angular,之后进入逸橙官网组使用angula ...

  7. Revit MEP API找到连接器连接的连接器

    通过conn.AllRefs;可以找到与之连接的连接器. //连接器连接的连接器 [TransactionAttribute(Autodesk.Revit.Attributes.Transaction ...

  8. ORA-10922 Temporary tablespace group is empty错误

    错误--练习查询,发现报错: SQL>  select * from range_list_part_tab where id=100000Execution Plan------------- ...

  9. ES6的新特性(1)——ES6 的概述

    ES6 的概述 首先,感谢马伦老师的ES6新特性的教程. ECMAScript 和 JavaScript 的关系是 ECMAScript 和 JavaScript 的关系是,前者是后者的规格,后者是前 ...

  10. PHP之冒号、endif、endwhile、endfor 是什么鬼&quest;f

    解释:其实这些都是PHP的语法,只不过不常用而已,这些都是PHP流程控制的替代语法. 冒号(:)相当于是 左大括号---->{ endif.endwhile.endfor.endforeach- ...