http://www.elijahqi.win/archives/1395
背景

陶醉在彩虹光芒笼罩的美景之中,探险队员们不知不觉已经穿过了七色虹,到达了目的地,面前出现了一座城堡和小溪田园,城堡前的木牌上写着“Poetic Island”。
“这一定就是另外两位护法的所在地了……我们快进去吧!”
探险队员们快步进入了城堡,城堡大厅的羊毛沙发上坐着两个人。
“你们是Nescafe的护法吧?”
“是的哦~ 我们就是圣剑护法rainbow和魔杖护法freda~ 你们来这里做什么呢~”
“我们是来拜访圣主和四位护法的……”
“可是圣主applepi已经前往超自然之界的学校(Preternatural Kingdom University,简称PKU)修炼魔法了,要想见到他,必须开启Nescafe之塔与超自然之界的通道。但是圣主规定,开启通道的方法不能告诉任何外人。我只能提示你们,开启通道的钥匙就与四位护法有关T_T”
探险队员环视四周,突然,其中一人的目光停留在了魔杖之上。“hoho~ 魔杖!传说中开启异时空通道的钥匙不就叫四叶草魔杖吗?四叶草有力量、信心、希望和幸运四片叶子,护法恰好有神刀、飞箭、圣剑、魔杖四位!aha~我找到答案了!”
“好吧,那我们就满足你们的愿望~”
描述

魔杖护法Freda融合了四件武器,于是魔杖顶端缓缓地生出了一棵四叶草,四片叶子幻发着淡淡的七色光。圣剑护法rainbow取出了一个圆盘,圆盘上镶嵌着N颗宝石,编号为0~N-1。第i颗宝石的能量是Ai。如果Ai>0,表示这颗宝石能量过高,需要把Ai的能量传给其它宝石;如果Ai<0,表示这颗宝石的能量过低,需要从其它宝石处获取-Ai的能量。保证∑Ai =0。只有当所有宝石的能量均相同时,把四叶草魔杖插入圆盘中央,才能开启超自然之界的通道。
不过,只有M对宝石之间可以互相传递能量,其中第i对宝石之间无论传递多少能量,都要花费Ti的代价。探险队员们想知道,最少需要花费多少代价才能使所有宝石的能量都相同?
输入格式

第一行两个整数N、M。
第二行N个整数Ai。
接下来M行每行三个整数pi,qi,Ti,表示在编号为pi和qi的宝石之间传递能量需要花费Ti的代价。数据保证每对pi、qi最多出现一次。
输出格式

输出一个整数表示答案。无解输出Impossible。
测试样例1

输入
3 3
50 -20 -30
0 1 10
1 2 20
0 2 100
输出
30
备注

对于 50% 的数据,2<=N<=8。
对于 100% 的数据,2<=N<=16,0<=M<=N*(N-1)/2,0<=pi,qi

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
inline char gc(){static char now[1<<16],*S,*T;if (T==S){T=(S=now)+fread(now,1,1<<16,stdin);if (T==S) return EOF;}return *S++;
}
inline int read(){int x=0,f=1;char ch=gc();while (ch<'0'||ch>'9') {if (ch=='-')f=-1;ch=gc();}while (ch<='9'&&ch>='0'){x=x*10+ch-'0';ch=gc();}return x*f;
}
int fa[20],dp[1<<18],n,m,a[20],bin[20],h[20],num;
inline int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);
}
struct node{int x,y,next,z;
}data[400],data1[400];
inline bool cmp(node a,node b){return a.z<b.z;}
int main(){//freopen("clover.in","r",stdin);n=read();m=read();memset(dp,0x3f,sizeof(dp));for (int i=0;i<=n;++i) bin[i]=1<<i;for (int i=0;i<n;++i) {a[i]=read();if (!a[i]) dp[bin[i]]=0;}for (int i=1;i<=m;++i){int x=read(),y=read(),z=read();data[++num].y=y;data[num].next=h[x];h[x]=num;data[num].z=z;data[num].x=x;}for (int s=1;s<=bin[n]-1;++s){int ans=0;for (int i=0;i<n;++i) if (bin[i]&s) ans+=a[i];if (!ans){num=0;int cnt=0;for (int i=0;i<n;++i) if (bin[i]&s) {fa[i]=i;cnt++;for (int j=h[i];j;j=data[j].next){int y=data[j].y;if (bin[y]&s) data1[++num]=data[j];}}int tmp=0;int tot=0;sort(data1+1,data1+num+1,cmp);/*if (s==bin[2]+bin[3]+bin[4]){for (int i=1;i<=num;++i) printf("%d %d %d\n",data1[i].x,data1[i].y,data1[i].z);printf("%d %d %d\n",fa[2],fa[3],fa[4]);}*/for (int i=1;i<=num;++i){int xx=find(data1[i].x),yy=find(data1[i].y);if (xx!=yy){fa[xx]=yy;tmp+=data1[i].z;if (++tot==cnt-1) {dp[s]=tmp;break;}}}}}//for (int s=1;s<=bin[n]-1;++s) if (dp[s]!=0x3f3f3f3f) printf("%d\n",dp[s]);for (int s=0;s<=bin[n]-1;++s){if (dp[s]==0x3f3f3f3f) continue;int ss=s^(bin[n]-1);for (int s1=ss;s1>0;s1=ss&(s1-1)){dp[s1|s]=min(dp[s1|s],dp[s1]+dp[s]);}}if (dp[bin[n]-1]==0x3f3f3f3f) printf("Impossible");elseprintf("%d",dp[bin[n]-1]);return 0;
}

tyvj 2054 [Nescafé29]四叶草魔杖相关推荐

  1. TYVJ 2054 [Nescafé29]四叶草魔杖 最小生成树 状态压缩/背包DP

    $ \rightarrow $ 戳我进TYVJ原题 [Nescafé29]四叶草魔杖 题目限制 时间限制 内存限制 评测方式 题目来源 1000ms 131072KiB 标准比较器 Local 题目背 ...

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

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

  3. 【NOIP2013模拟】四叶草魔杖

    [NOIP2013模拟]四叶草魔杖 Time Limits: 1000 ms Memory Limits: 131072 KB Description 魔杖护法Freda融合了四件武器,于是魔杖顶端缓 ...

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

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

  5. tyvj 2053 [Nescafé29]穿越七色虹

    http://www.elijahqi.win/archives/1398 背景 在Nescafe27和28中,讲述了一支探险队前往Nescafe之塔探险的故事-- 当两位探险队员以最快的时间把礼物放 ...

  6. 轻松解决夜神逍遥模拟器模拟器等模拟器无法连接问题

    其实这些技巧我早就知道了,只是我一直没有什么分享精神,也很少去记忆,有时候发现这个问题了我竟然没想到用这些技巧解决. 有些问题当时解决了,长时间不操作,慢慢忘记了,当时巩固吧!也为自己有时候的愚蠢做解 ...

  7. mysql导入向导,SQL Server--导入和导出向导

    作用:创建一个只需要最少的转换就可以快速导入或导出数据的包 操作步骤: 1 打开打入和导出向导方式 有四种方式 1)在SSMS(SQL Server Management Studio)中,右击目标数 ...

  8. [noip模拟赛2017.7.4]

    题目名称 穿越七色虹 四叶草魔杖 圣主的考验 程序文件 rainbow clover domine 输入文件 rainbow.in clover.in domine.in 输出文件 rainbow.o ...

  9. Dairy?Diary!

    2019/9/20 既来之则安之.没什么好惆怅好难过的. 竞赛本来就是你现在的任务重心 这样的安排也可以为你提供更多的学习时间 你不是总闹着时间不够用吗 现在就好啦,你可以抓紧时间搞了 每周六8:00 ...

最新文章

  1. 【从零开始的ROS四轴机械臂控制】(五)- 构建运动控制服务
  2. opencv mat2 ffmpeg frame
  3. 我们来谈下高并发和分布式中的幂等处理
  4. c++对象模型-虚拟析构函数
  5. mysql模糊查询后分页_jsp模糊查询后的数据进行分页,但点击下一页后就查询全部的了...
  6. SQL存储过程实例具体解释
  7. DevC++最新汉化版(支持C++11)
  8. Nginx服务学习(6)-日志模块
  9. 有100个GMAIL的邀请,需要的来信就可以啦。
  10. c语言程序装萝卜,c语言编程题库(大一c语言编程题库)
  11. Android apk快速定位、灰色按钮克星--DroidSword
  12. 计算机论文中期考核报告,计算机与人工智能学院硕士研究生中期考核办法
  13. 说说自己找互联网工作的经验
  14. 练习题|文件操作和函数
  15. DHCP 和 DHCP-Realy 功能演示完整示例
  16. 太原理工大学计算机学院王华,王华(首都师范大学信息工程学院教授)_百度百科...
  17. typescript77-在CRA创建支持ts的项目
  18. JAVA设计模式什么鬼(策略)——作者:凸凹里歐
  19. note3 android system recovery,三星note3 N9008V官方刷机包
  20. php循环分页,如何使用PHP在foreach循环中对行进行分页

热门文章

  1. LAB 2-2 自制博饼软件
  2. C#实现幸运水果机抽奖动画功能
  3. Python实现数据加密-解密
  4. std::array
  5. 对安全研究人员和渗透测试人员有用的Firefox 插件
  6. JAVA学习笔记- - - day 2
  7. 著作权保护意见允许当事人通过区块链等方式提交证据
  8. Echo团队 对 待就业六人组 和 SkyReach 的Beta产品测试报告
  9. java sax_Java教程分享详细了解Javasax解析器
  10. flutter底部抽屉