BZOJ_3058_四叶草魔杖_kruscal+状压DP
BZOJ_3058_四叶草魔杖_kruscal+状压DP
Description
魔杖护法Freda融合了四件武器,于是魔杖顶端缓缓地生出了一棵四叶草,四片叶子幻发着淡淡的七色光。圣剑护法rainbow取出了一个圆盘,圆盘上镶嵌着N颗宝石,编号为0~N-1。第i颗宝石的能量是Ai。如果Ai>0,表示这颗宝石能量过高,需要把Ai的能量传给其它宝石;如果Ai<0,表示这颗宝石的能量过低,需要从其它宝石处获取-Ai的能量。保证∑Ai =0。只有当所有宝石的能量均相同时,把四叶草魔杖插入圆盘中央,才能开启超自然之界的通道。
不过,只有M对宝石之间可以互相传递能量,其中第i对宝石之间无论传递多少能量,都要花费Ti的代价。探险队员们想知道,最少需要花费多少代价才能使所有宝石的能量都相同?
Input
第一行两个整数N、M。
第二行N个整数Ai。
接下来M行每行三个整数pi,qi,Ti,表示在编号为pi和qi的宝石之间传递能量需要花费Ti的代价。数据保证每对pi、qi最多出现一次。
Output
输出一个整数表示答案。无解输出Impossible。
Sample Input
50 -20 -30
0 1 10
1 2 20
0 2 100
Sample Output
HINT
对于 100% 的数据,2<=N<=16,0<=M<=N*(N-1)/2,0<=pi,qi<N,-1000<=Ai<=1000,0<=Ti<=1000,∑Ai=0。
可以转化成这样一个问题:将原图划分成若干个连通块,使得每个连通块内权值和为0,求最小代价。
由于n特别小可以状压,f[i]表示状态为i时最小的联通代价。
对于每个和为0的集合,用kruscal求使这个集合连通的最小代价,然后DP即可。
代码:
#include <cstdio>
#include <string.h>
#include <algorithm>
using namespace std;
int cal[1<<16],n,m,a[20],f[1<<16],g[1<<16],fa[20];
struct E {
int x,y,z;
bool operator < (const E &u) const {
return z<u.z;
}
}e[350];
int find(int x) {return fa[x]==x?x:fa[x]=find(fa[x]);}
void dfs(int dep,int sta,int sum) {
if(dep==n) {
cal[sta]=sum; return ;
}
dfs(dep+1,sta|(1<<dep),sum+a[dep+1]);
dfs(dep+1,sta,sum);
}
void build(int sta) {
int i,num=0;
for(i=1;i<=n;i++) {
fa[i]=i; if(sta&(1<<(i-1))) num++;
}
int re=0,cnt=0;
for(i=1;i<=m;i++) {
int dx=find(e[i].x),dy=find(e[i].y);
if((sta&(1<<(dx-1)))&&(sta&(1<<(dy-1)))&&dx!=dy) {
fa[dx]=dy; re+=e[i].z; cnt++; if(cnt==num-1) break;
}
}
if(cnt==num-1) f[sta]=re;
}
int main() {
// freopen("shield.in","r",stdin);
// freopen("shield.out","w",stdout);
scanf("%d%d",&n,&m);
int i,j;
for(i=1;i<=n;i++) scanf("%d",&a[i]);
dfs(0,0,0);
for(i=1;i<=m;i++) {
scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].z); e[i].x++; e[i].y++;
}
sort(e+1,e+m+1);
int mask=(1<<n)-1;
memset(f,0x3f,sizeof(f));
f[0]=0;
for(i=1;i<=mask;i++) {
if(cal[i]==0) {
build(i);
}
}
for(i=0;i<=mask;i++) {
for(j=i&(i-1);j;j=i&(j-1)) {
if(f[j]<=1000000&&f[i-j]<=1000000) f[i]=min(f[i],f[j]+f[i-j]);
}
}
if(f[mask]<=10000000) printf("%d\n",f[mask]);
else puts("Impossible");
}
/*
3 3
50 -20 -30
0 1 10
1 2 20
0 2 100
*/
BZOJ_3058_四叶草魔杖_kruscal+状压DP的更多相关文章
- [tyvj2054] 四叶草魔杖 (最小生成树 状压dp)
传送门 Background 陶醉在彩虹光芒笼罩的美景之中,探险队员们不知不觉已经穿过了七色虹,到达了目的地,面前出现了一座城堡和小溪田园,城堡前的木牌上写着"Poetic Island&q ...
- BZOJ.3058.四叶草魔杖(Kruskal 状压DP)
题目链接 \(2^{16}=65536\),可以想到状压DP.但是又有\(\sum A_i\neq 0\)的问题.. 但是\(2^n\)这么小,完全可以枚举所有子集找到\(\sum A_i=0\)的, ...
- tyvj 2054 [Nescafé29]四叶草魔杖——最小生成树+状压dp
题目:http://www.joyoi.cn/problem/tyvj-2054 枚举点集,如果其和为0,则作为一个独立的块求一下最小生成树.因为它可以不和别的块连边. 然后状压dp即可. 别忘了判断 ...
- tyvj2054 四叶草魔杖——连通块 & 状压DP
题目:http://www.joyoi.cn/problem/tyvj-2054 把点分成几个连通块,和为0的几个点放在一块,在块内跑最小生成树作为这个块的代价: 然后状压DP,组成全集的最小代价就是 ...
- BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3336 Solved: 1936[Submit][ ...
- nefu1109 游戏争霸赛(状压dp)
题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1109 //我们校赛的一个题,状压dp,还在的人用1表示,被淘汰 ...
- poj3311 TSP经典状压dp(Traveling Saleman Problem)
题目链接:http://poj.org/problem?id=3311 题意:一个人到一些地方送披萨,要求找到一条路径能够遍历每一个城市后返回出发点,并且路径距离最短.最后输出最短距离即可.注意:每一 ...
- [NOIP2016]愤怒的小鸟 D2 T3 状压DP
[NOIP2016]愤怒的小鸟 D2 T3 Description Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可 ...
- 【BZOJ2073】[POI2004]PRZ 状压DP
[BZOJ2073][POI2004]PRZ Description 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍 ...
随机推荐
- CodeForces230A
题目大意: 一个打恐龙的游戏,有初始体力s,和恐龙n只,然后输入n只恐龙的体力xi,和击杀它得到的奖励体力yi,只有自身体力大于恐龙体力时才能进行击杀,击杀恐龙的顺序可以不定 这题运用到了贪心的思想, ...
- hdu 4539
#include<stdio.h> #include<string.h> ]; int s]; int main() { int i,j,n,m; int ch; while( ...
- Python基础教程笔记——第3章:使用字符串
字符串是不可修改的,标准序列操作(索引,分片,判断成员资格,求长度,取最大值 最小值)对字符串都是有效的. 格式化字符串,类似于C语言的输出是的感觉. >>> format=&quo ...
- linux命令1——基础
Rm 删除命令 Rm [选项][文件] 删除一个文件或者目录 选项:r 递归的删除文件夹及其子文件,f 忽略不存在的文件(不提示) (2)rm删除目录下所有文件,但不删除目录 >>rm - ...
- 修改textfield的占位符颜色
[self.titleField setValue:UIColorFromHEXWithAlpha(0x999999, 1) forKeyPath:@"_placeholderLabel.t ...
- SystemInformationRequestHandlers
SystemInformationRequestHandlers - Solr Wiki Search: Solr Wiki Login SystemInformationRequestHandler ...
- HDU 5573 Binary Tree【构造】
几天前模拟区域赛的一道题,今天发现在草稿箱里直接补个博客. 感觉这还是一道很有意思的构造题. 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5573 ...
- POJ 1704 Georgia and Bob【博弈】
题目链接: http://poj.org/problem?id=1704 题意: 给定棋子及其在格子上的坐标,两个人轮流选择一个棋子向左移动,每次至少移动一格,但是不可以碰到其他棋子.无路可走的时候视 ...
- springboot使用过程中遇到的问题
一.工具Intellij IDEA 二.基本问题 1.数据库语句 Caused by: java.lang.IllegalStateException: Cannot load driver clas ...
- 2018.11.3 PION模拟赛
期望:100 实际:100 #include<cstdio> #include<cstring> #include<iostream> #include< ...