2017.07.05【NOIP提高组】模拟赛A组 灯

来源:互联网 发布:web服务器端编程 编辑:程序博客网 时间:2024/05/17 01:20

Description

  贝希和她的闺密们在她们的牛棚中玩游戏。但是天不从人愿,突然,牛棚的电源跳闸了,所有的灯都被关闭了。贝希是一个很胆小的女生,在伸手不见拇指的无尽的黑暗中,她感到惊恐,痛苦与绝望。她希望您能够帮帮她,把所有的灯都给重新开起来!她才能继续快乐地跟她的闺密们继续玩游戏!
  牛棚中一共有N(1 <= N <= 35)盏灯,编号为1到N。这些灯被置于一个非常复杂的网络之中。有M(1 <= M <= 595)条很神奇的无向边,每条边连接两盏灯。
  每盏灯上面都带有一个开关。当按下某一盏灯的开关的时候,这盏灯本身,还有所有有边连向这盏灯的灯的状态都会被改变。状态改变指的是:当一盏灯是开着的时候,这盏灯被关掉;当一盏灯是关着的时候,这盏灯被打开。
  问最少要按下多少个开关,才能把所有的灯都给重新打开。
  数据保证至少有一种按开关的方案,使得所有的灯都被重新打开。

Input

  第一行:两个空格隔开的整数:N和M。

  第二到第M+1行:每一行有两个由空格隔开的整数,表示两盏灯被一条无向边连接在一起。没有一条边会出现两次。

Output

  第一行:一个单独的整数,表示要把所有的灯都打开时,最少需要按下的开关的数目。

Sample Input

5 6
1 2
1 3
4 2
3 4
2 5
5 3

Sample Output

3

Solution

暴力
但是直接暴力是235的,显然会超时
那么采取折半搜索的方式,分成217218,表示每个开关是否按过
显然每个开关只会按一次
235的二进制状态表示n盏灯是否是亮的,用类似双向广搜的思想来做即可
C++选手用map存很方便

Code

#include<cstdio>#include<algorithm>#include<cstring>#include<map>#define fo(i,a,b) for(int i=a;i<=b;i++)#define N 101#define M 1234567#define ll long longusing namespace std;int n,m,a[N][N],as[M],m1,m2,bz[N],ans=214748347;ll e[N],h[M],xo[N];map<ll,int> f;void dg(int x){    if(x>m1)    {        int an=0;        ll jy=0;        fo(i,1,m1) if(bz[i]) jy^=xo[i],an++;        an++;        if(f[jy]!=0) f[jy]=min(f[jy],an);        else f[jy]=an;        return;    }    bz[x]=1;dg(x+1);    bz[x]=0;dg(x+1);}void dg1(int x){    if(x>m2)    {        int an=0;        ll jy=0;        fo(i,m1+1,m2) if(bz[i]) jy^=xo[i],an++;        if(f[e[n]-1-jy]!=0) ans=min(ans,an+f[e[n]-1-jy]-1);        return;    }    bz[x]=1;dg1(x+1);    bz[x]=0;dg1(x+1);}int main(){    scanf("%d%d",&n,&m);    fo(i,1,m)    {        int x,y;scanf("%d%d",&x,&y);        a[x][++a[x][0]]=y;        a[y][++a[y][0]]=x;    }    e[0]=1;fo(i,1,36) e[i]=e[i-1]*2ll;    fo(i,1,n)    {        ll jy=e[i-1];        fo(j,1,a[i][0]) jy+=e[a[i][j]-1];        xo[i]=jy;    }    m1=min(18,n);m2=n;    f[0]=1;    dg(1);    dg1(m1+1);    printf("%d",ans);}
阅读全文
1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 两岁宝宝入睡难怎么办 吃激素掉发严重怎么办 20多岁掉头发怎么办 最近头发老掉怎么办20 20多岁最近严重脱发怎么办 头痒头皮屑多掉头发怎么办 有头屑头痒掉头发怎么办 老是头痒掉头发怎么办 头屑头痒掉头发怎么办 头痒头屑多掉头发怎么办 洗头发时总是掉发怎么办 染头发染到脸上洗不掉怎么办 总爱掉头发怎么办20岁 头发开叉长的慢怎么办 洗头时掉很多头发怎么办 出门前头发很油怎么办 关于头发头顶头发少怎么办 每天掉100根头发怎么办 小孩嘴巴烂了该怎么办 小孩吃烧烤嘴巴肿好大该怎么办 脸特别瘦的人怎么办 怀孕宝宝太懒了怎么办 奶油胶手机壳脏了怎么办 为什么电脑桌面壁纸变成黑色怎么办 仓鼠妈妈老忘了宝宝怎么办 木工三排多轴钻床气缸坏了怎么办? 水溶笔洗不掉怎么办 针管笔没有墨了怎么办 二岁小儿不爱吃饭怎么办 狗狗一直挠痒痒怎么办 手被铅笔扎了怎么办 小孩智力轻度低下该怎么办 发侮辱人的信息怎么办 宋民国表情我能怎么办 苹果手机微信弄成听筒模式怎么办 我的小可爱丢了怎么办 法斗犬老是皮肤病看也看不好怎么办 项链水晶不亮了怎么办 美甲画画手抖怎么办 微信中的表情符号不全怎么办 球球大作战找不到团战服务器怎么办