很有意思的最小生成树啊。

网上的题解大多是状压+最小生成树,经过我的试验,其实只要把每个联通块找出来,一个个做一次就可以了。

放一个状压的。懒得再写一个搜索找联通块

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std; int n,m;
struct edge{int x,y,d;}e[];
bool cmp(edge e1,edge e2){return e1.d<e2.d;}
int fa[];
int findfa(int x)
{
if(fa[x]==x)return x;
fa[x]=findfa(fa[x]);return findfa(fa[x]);
}
int kruscal(int zt)
{
int cnt=;
for(int i=;i<=n;i++)
if(zt&(<<i-))fa[i]=i,cnt++;
if(cnt==)return ; int ans=;
for(int i=;i<=m;i++)
if((zt&(<<e[i].x-))&&(zt&(<<e[i].y-)))
{
int fx=findfa(e[i].x),fy=findfa(e[i].y);
if(fx!=fy)
{
fa[fx]=fy;
ans+=e[i].d;
cnt--;if(cnt==)return ans;
}
}
return (<<);
}
int c[],sum[],f[];
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)scanf("%d",&c[i]);
for(int i=;i<=m;i++)
{
scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].d),e[i].x++,e[i].y++;
if(e[i].x==e[i].y)i--,m--;
}
sort(e+,e+m+,cmp); int maxp=(<<n)-;
for(int zt=;zt<=maxp;zt++)
{
sum[zt]=;
for(int i=;i<=n;i++)
if(zt&(<<(i-)))sum[zt]+=c[i];
if(sum[zt]==)f[zt]=kruscal(zt);
}
for(int zt1=;zt1<=maxp;zt1++) if(sum[zt1]==&&f[zt1]!=(<<))
for(int zt2=zt1+;zt2<=maxp;zt2++) if(sum[zt2]==&&f[zt2]!=(<<))
if((!(zt1&zt2)))
f[zt1|zt2]=min(f[zt1|zt2],f[zt1]+f[zt2]); if(sum[maxp]!=||f[maxp]==(<<))printf("Impossible\n");
else printf("%d\n",f[maxp]);
return ;
}

bzoj5038 四叶草魔杖的更多相关文章

  1. BZOJ_3058_四叶草魔杖_kruscal+状压DP

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

  2. [tyvj2054] 四叶草魔杖 (最小生成树 状压dp)

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

  3. BZOJ3058 四叶草魔杖

    Poetize11的T3 蒟蒻非常欢脱的写完了费用流,发现...边的cost竟然只算一次!!! 然后就跪了... Orz题解:"类型:Floyd传递闭包+最小生成树+状态压缩动态规划首先Fl ...

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

    题目链接 \(2^{16}=65536\),可以想到状压DP.但是又有\(\sum A_i\neq 0\)的问题.. 但是\(2^n\)这么小,完全可以枚举所有子集找到\(\sum A_i=0\)的, ...

  5. tyvj 2054 [Nescafé29]四叶草魔杖——最小生成树+状压dp

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

  6. tyvj 2054 [Nescafé29]四叶草魔杖【克鲁斯卡尔+状压dp】

    传送:http://www.joyoi.cn/problem/tyvj-2054 来自lyd课件: 所以先预处理出各个sum为0的块,然后状压dfs取min来得到答案 #include<iost ...

  7. tyvj2054 四叶草魔杖——连通块 & 状压DP

    题目:http://www.joyoi.cn/problem/tyvj-2054 把点分成几个连通块,和为0的几个点放在一块,在块内跑最小生成树作为这个块的代价: 然后状压DP,组成全集的最小代价就是 ...

  8. [tyvj-2054][Nescafé29]四叶草魔杖 费用流

    lyd讲的最小生成树的题. 道理我都懂,费用流多好写,又好调.但和一般费用流不一样的就是它走过一次后费用需调成0,但是再等回流,就恢复原状即可. #include <queue> #inc ...

  9. NOIP系列复习及题目集合

    首先是我的酱油记了啦~: Xs的NOIP2014酱油记,持续更新中 知识点方面: noip知识点总结之--贪心 noip知识点总结之--线性筛法及其拓展 noip知识点总结之--欧几里得算法和扩展欧几 ...

随机推荐

  1. python 根据数组生成图片

    array = np.asarray(allBigPng, dtype=np.uint8)image = Image.fromarray(array, 'RGBA') image.save(outpu ...

  2. Python3 每次处理一个字符

    """ Python3.4[文本]之每次处理一个字符 """ test_str = "my name is bixiaopeng& ...

  3. vim之补全1(完全个人定制版)

    关于vim的补全最初的感觉是蛋疼, 真正的蛋疼! 由于在接触linux之前曾经在windows下面学过一段时间软件开发, 那时使用的是vs2010, 现在看来虽然vs启动相当的慢, 编辑器的定制和配置 ...

  4. Cesium学习笔记(五):3D 模型 (http://blog.csdn.net/umgsoil/article/details/74572877)

    Cesium支持3D模型,包括关键帧动画,皮肤的改变还有单个节点的选择等,Cesium还提供了了一个基于网络的工具,将COLLADA模型转换为glTF,方便和优化模型添加 还记得我们在实体添加的时候添 ...

  5. CAD插入jpg

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...

  6. charAt 写一个反序函数

    function reverStr(str){ var tmpStr = ""; for(var i=str.length-1;i>=0;i--){ tmpStr += st ...

  7. 通过javascript在iframe中加载html

    在spring mvc中,虽然有时候,在控制器中设置返回值是json对象,但在拦截器出现错误的时候,仍然可能返回html(根据设置的不同),如果要展示这些html,最好把他们放入iframe中,以防这 ...

  8. Opencv学习之路——自己编写的HOG算法

    #include<opencv2\core\core.hpp> #include<opencv2\highgui\highgui.hpp> #include<opencv ...

  9. 洛谷——P3833 [SHOI2012]魔法树

    P3833 [SHOI2012]魔法树 题目背景 SHOI2012 D2T3 题目描述 Harry Potter 新学了一种魔法:可以让改变树上的果子个数.满心欢喜的他找到了一个巨大的果树,来试验他的 ...

  10. P2080 增进感情

    题目背景 小明和小红的感情,是慢慢发展起来的. 题目描述 他们对对方分别有一个好感值.定义两人的亲密程度为两人的好感值之和. 如果他们的亲密程度达到V,则他们将走到一起.他们以后的生活将取决于两人的好 ...