刚刚上一篇博客才D了队长一发,心里虚的慌......万分感谢队长给讲折半搜索!!听说这题可以高斯消元(可是我不会...貌似折半我也不会)

这题呢,一想到就是爆搜啦,然而,爆搜2^35必跪,折半搜索,就让他变成了2^17+2^18,这下明白一点了吧,然后假设现在要从全灭到全开,状压一下就是一个LL的数了,然后从00000~10101(假设嘛)我们只按左边的按钮,11111~01010只按右边的,那加起来不就是答案啦。

#include<map>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
LL Bin[];
int cnt,mn;
LL p[],ed;//状压,p[i]代表假如我按i,会对那些造成影响就在相应位上记为1
bool half;
map<LL,int>f;
void dfs(int x,LL now,int d)
{
if(x==cnt+)
{
if(now==ed)mn=min(mn,d);//到达
else
{
if(half==false)//第一次,记录到达该状态的最优方案
{
int c=f[now];
if(c==||c>d)f[now]=d;
}
else //第二次,看看我和其他合并能否到达最终状态
{
int c=f[ed-now];
if(c!=)mn=min(mn,c+d);
}
}
return ;
}
dfs(x+,now,d);//穷举状态
dfs(x+,now^p[x],d+);
}
int main()
{
int n,m,x,y;
scanf("%d%d",&n,&m);
p[]=Bin[]=;for(int i=;i<=n+;i++)p[i]=Bin[i]=Bin[i-]*;
ed=Bin[n+]-;//结束状态就是全为1 for(int i=;i<=m;i++)
{
scanf("%d%d",&x,&y);
p[x]+=Bin[y];p[y]+=Bin[x];//记录所影响的
} mn=;
half=false;cnt=n/;dfs(,,);//折半搜索
half=true;cnt=n;dfs(n/+,,);
printf("%d\n",mn);
return ;
}

最新文章

  1. [LeetCode] Scramble String 爬行字符串
  2. variadic function 的使用
  3. ASP.NET MVC搭建项目后台UI框架—3、面板折叠和展开
  4. HTML音乐播放——切歌
  5. Jenkins Git 中文乱码问题解决
  6. 在Handler.ashx文件中使用session
  7. LM算法
  8. 【CF】328 D. Super M
  9. 【HTML】Beginner5:List
  10. 如何在jasperreport自动生成序号
  11. flex blazeds地址
  12. IdentityServer4-介绍大纲(译文)
  13. [SDOI 2008]仪仗队
  14. Missing initializer in const declaration
  15. BZOJ2219数论之神——BSGS+中国剩余定理+原根与指标+欧拉定理+exgcd
  16. 【问题跟踪】KryoException: java.io.IOException: No space left on device
  17. A Tool To Plot Mathematical Function
  18. spring框架学习(五)整合JDBCTemplate
  19. mySQL数据库三:命令行附录
  20. gps数据上传防止android系统休眠

热门文章

  1. java中如何将string转化成long
  2. @locked_cached_property ---flask.helpers模块
  3. 【RMAN】RMAN跨版本恢复(下)--大版本异机恢复
  4. [HNOI2012] 永无乡 题解
  5. [BZOJ3052][UOJ#58][WC2013]糖果公园
  6. Linux Bash对拍
  7. leetcode之twosum
  8. msp430入门编程37
  9. .net core webapi jwt 更为清爽的认证 ,续期很简单(2)
  10. python 爬虫(转,我使用的python3)