题目:http://www.joyoi.cn/problem/tyvj-2054

枚举点集,如果其和为0,则作为一个独立的块求一下最小生成树。因为它可以不和别的块连边。

然后状压dp即可。

别忘了判断该块能不能连通。

别忘了判断无解!(0x3f 真好用)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=,M=N*(N-)/,Lm=(<<)+;
int n,m,a[N],hd[N],c[Lm],lm,v[Lm],cnt,dp[Lm],fa[N];
bool vis[Lm];
struct Ed{
int x,y,w;
Ed(int x=,int y=,int w=):x(x),y(y),w(w) {}
}ed[M];
bool cmp(Ed x,Ed y){return x.w<y.w;}
int find(int a){return fa[a]==a?a:fa[a]=find(fa[a]);}
void kruscal(int s,int &k)
{
for(int i=;i<=n;i++)fa[i]=i;
for(int i=;i<=m;i++)
{
int x=ed[i].x,y=ed[i].y;
if(((<<(x-))&s)&&((<<(y-))&s)&&find(x)!=find(y))
{
fa[(find(x))]=find(y);c[k]+=ed[i].w;
}
}
int tf=;
for(int i=;i<n;i++)
if((<<i)&s)
{
if(!tf)tf=find(i+);
else if(find(i+)!=tf){v[k]=c[k]=;k--;return;}
}
}
void init()
{
sort(ed+,ed+m+,cmp);
for(int s=;s<lm;s++)
{
int sum=;
for(int j=;j<n;j++) if((<<j)&s) sum+=a[j+];
if(sum)continue;
v[++cnt]=s;kruscal(s,cnt);
}
}
void dfs(int s)
{
if(vis[s])return;vis[s]=;
for(int i=;i<=cnt;i++)
if((s&v[i])==v[i])
{
dfs(s-v[i]);dp[s]=min(dp[s],dp[s-v[i]]+c[i]);
}
}
int main()
{
scanf("%d%d",&n,&m);int x,y,z;lm=(<<n);
for(int i=;i<=n;i++)scanf("%d",&a[i]);
for(int i=;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
ed[i]=Ed(x+,y+,z);
}
init();
memset(dp,0x3f,sizeof dp);dp[]=;
dfs(lm-);
if(dp[lm-]==0x3f3f3f3f)printf("Impossible");
else printf("%d",dp[lm-]);
return ;
}

tyvj 2054 [Nescafé29]四叶草魔杖——最小生成树+状压dp的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. [WC2008]游览计划(状压dp)

    题面太鬼畜不粘了. 题意就是给一张n*m的网格图,每个点有点权,有k个关键点,让你把这k个关键点连成一个联通快的最小代价. 题解 这题nmk都非常小,解法肯定是状压,比较一般的解法插头dp,但不太好写 ...

  7. bzoj1402 Ticket to Ride 斯坦纳树 + 状压dp

    给定\(n\)个点,\(m\)条边的带权无向图 选出一些边,使得\(4\)对点之间可达,询问权值最小为多少 \(n \leqslant 30, m \leqslant 1000\) 首先看数据范围,\ ...

  8. luogu4294 [WC2008]游览计划(状压DP/斯坦纳树)

    link 题目大意:给定一个网格图,有些点是关键点,选择格点有代价,求把所有关键点联通的最小代价 斯坦纳树模板题 斯坦纳树问题:给定一个图结构,有一些点是关键点,求把这些关键点联通的最小代价e 斯坦纳 ...

  9. 【ZJOI2017 Round1练习&BZOJ4774】D3T2 road(斯坦纳树,状压DP)

    题意: 对于边带权的无向图 G = (V, E),请选择一些边, 使得1<=i<=d,i号节点和 n − i + 1 号节点可以通过选中的边连通, 最小化选中的所有边的权值和. d< ...

随机推荐

  1. 【leetcode刷题笔记】Sudoku Solver

    Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are indicated by th ...

  2. Plist文件与数据解析

    综述 初步阶段当我们做个需要点数据的练习时(比如购物商品展示),我们可能是将数据直接写在代码中,比如说定义一个字符串数组或存放字典的数组.但这其实并不是一种合理的做法.因为如果当数据修改的时候,就要经 ...

  3. VS中一个强大的功能,将Json或者XML黏贴为类

    有时候需要传递json,或者是json结构复杂,看的杂乱无章,我们可以将这个json复制下来,然后将它写成类的形式,VS中已经帮我们很好的实现了这个功能,我们只需要选择   编辑===>> ...

  4. 关于v4l2的一点变更

    先打个连接 http://linuxtv.org/downloads/presentations/media_ws_2013/v4l2-multi-format.pdf 2013年linux 多媒体构 ...

  5. poj 1573 Robot Motion【模拟题 写个while循环一直到机器人跳出来】

                                                                                                         ...

  6. CCNA 课程 二

    传输层:两个重要的协议 TCP 和 UDP TCP: 面向连接的协议:在传输用户数据前,先要建立连接 (TCP的三次握手) 错误检查 数据包序列化 可靠性传输:发送的数据需要接受者提供确认,通过报头中 ...

  7. 语义web相关概念

    前言:最近做的项目是自然语言处理相关的,看了一本书<语义web技术基础>,总的来看,接触自然语言处理,语义理解也有差不多一年的时间了.这两天想了一想,自己究竟学到了什么,掌握了哪些新的知识 ...

  8. linux下常用FTP命令 1. 连接ftp服务器[转]

    1. 连接ftp服务器 格式:ftp [hostname| ip-address]a)在linux命令行下输入: ftp 192.168.1.1 b)服务器询问你用户名和密码,分别输入用户名和相应密码 ...

  9. MyBatis联合查询association使用

    1.需求 两张表 channels(频道表)  member(会员表) 频道表里面有会员id,查询频道列表的时候需要关联查询出会员的名称,头像等信息 . 2.channels.xml定义,配置主要在这 ...

  10. spark学习3(sqoop1.4.6安装)

    sqoop目前有两个版本sqoop1和sqoop2,这里安装的是sqoop1版本 1)将软件上传到spark1节点 2)修改权限 [root@spark1 sqoop]# chmod u+x sqoo ...