\(\color{#0066ff}{题目描述}\)

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

\(\color{#0066ff}{输入格式}\)

  • Line 1: Two space-separated integers: N and M.

  • Lines 2..M+1: Each line contains two space-separated integers representing two lights that are connected. No pair will be repeated.

\(\color{#0066ff}{输出格式}\)

  • Line 1: A single integer representing the minimum number of switches that need to be flipped in order to turn on all the lights.

\(\color{#0066ff}{输入样例}\)

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

\(\color{#0066ff}{输出样例}\)

3 

\(\color{#0066ff}{题解}\)

看n的范围,显然可以对抗搜索

用\(O(2^n)\)枚举出前半部分的点选或不选,并记录到达状态的最小步数(用map)

再搜后半部分点选或不选,只要能跟刚刚的拼上,就更新答案

#include<cstdio>
#include<queue>
#include<vector>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<map>
#define _ 0
#define LL long long
#define Space putchar(' ')
#define Enter putchar('\n')
#define fuu(x,y,z) for(int x=(y),x##end=z;x<=x##end;x++)
#define fu(x,y,z)  for(int x=(y),x##end=z;x<x##end;x++)
#define fdd(x,y,z) for(int x=(y),x##end=z;x>=x##end;x--)
#define fd(x,y,z)  for(int x=(y),x##end=z;x>x##end;x--)
#define mem(x,y)   memset(x,y,sizeof(x))
#ifndef olinr
inline char getc()
{static char buf[100001],*p1=buf,*p2=buf;return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,100001,stdin),p1==p2)? EOF:*p1++;
}
#else
#define getc() getchar()
#endif
template<typename T>inline void in(T &x)
{int f=1; char ch; x=0;while(!isdigit(ch=getc()))(ch=='-')&&(f=-f);while(isdigit(ch)) x=x*10+(ch^48),ch=getc();x*=f;
}
int n,m;
std::map<LL,int> mp;
LL zt[55];
int mid;
int ans=0x7fffffff;
inline void dfs1(int now,LL z,int step)
{if(now==mid+1){if(!mp.count(z)) mp[z]=step;else mp[z]=std::min(mp[z],step);return;}dfs1(now+1,z^zt[now],step+1);dfs1(now+1,z,step);
}
inline void dfs2(int now,LL z,int step)
{if(now==n+1){if(mp.count(z)) ans=std::min(ans,step+mp[z]);return;}dfs2(now+1,z^zt[now],step+1);dfs2(now+1,z,step);
}
int main()
{in(n),in(m);int x,y;fuu(i,1,m) in(x),in(y),zt[x]|=1LL<<(y-1),zt[y]|=1LL<<(x-1);fuu(i,1,n) zt[i]|=(1<<(i-1));mid=(1+n)>>1;dfs1(1,(1LL<<n)-1,0);dfs2(mid+1,0LL,0);printf("%d",ans);return ~~(0^_^0);
}

转载于:https://www.cnblogs.com/olinr/p/10061181.html

P2962 [USACO09NOV]灯Lights 对抗搜索相关推荐

  1. 洛谷 P2962 [USACO09NOV]灯Lights

    P2962 [USACO09NOV]灯Lights 题目描述 Bessie and the cows were playing games in the barn, but the power was ...

  2. P2962 [USACO09NOV]灯Lights

    贝希和她的闺密们在她们的牛棚中玩游戏.但是天不从人愿,突然,牛棚的电源跳闸了,所有的灯都被关闭了.贝希是一个很胆小的女生,在伸手不见拇指的无尽的黑暗中,她感到惊恐,痛苦与绝望.她希望您能够帮帮她,把所 ...

  3. 博弈论经典算法(一)——对抗搜索与Alpha-Beta剪枝

    前言 在一些复杂的博弈论题目中,每一轮操作都可能有许多决策,于是就会形成一棵庞大的博弈树. 而有一些博弈论题没有什么规律,针对这样的问题,我们就需要用一些十分玄学的算法. 例如对抗搜索. 对抗搜索简介 ...

  4. BZOJ 5248: [2018多省省队联测]一双木棋(对抗搜索+记忆化)

    题目传送门 https://www.lydsy.com/JudgeOnline/problem.php?id=5248 思路 显然每个局面,落子无悔后都是一个从上往下的非严格递减阶梯. 所以有效的状态 ...

  5. 人工智能 一种现代方法 第5章 对抗搜索

    文章目录 博弈 博弈中的优化决策 Minmax算法(极小极大算法) 多人博弈时的最优决策 α-β剪枝(重点) 不完美的实时决策 评估函数 截断搜索 向前剪枝 资源分享 博弈 对抗搜索:竞争环境中每个A ...

  6. 【人工智能导论】吃豆人游戏(上):对抗搜索与Minimax算法

    吃豆人实验(The Pac-Man Project)简介 The Pac-Man projects were developed for UC Berkeley's introductory arti ...

  7. 【AI】对抗搜索:Alpha-Beta剪枝搜索图解及井字棋应用的python实现

    一.对抗搜索简介   对抗搜索也称为博弈搜索,在一个竞争的环境中,智能体之间通过竞争实现相反的利益,一方最大化这个利益,另外一方最小化这个利益.   最小最大搜索(Minimax Search)是对抗 ...

  8. 人工智能学习(四):对抗搜索

    目录 3.1 引言 3.2 游戏的分类 3.3 形式化游戏问题 3.4 零和游戏 3.5 对抗性搜索 3.5.1 单代理博弈树 3.5.2 对抗性游戏 3.5.2.1 Minmax 3.5.2.2 M ...

  9. 【算法与数据结构】——对抗搜索

    文章目录 对抗搜索 最大最小搜索(MinMax搜索) minmax搜索评价 Alpha-Beta剪枝搜索(Pruning Search) 对抗搜索 对抗搜索也称为博弈搜索 在一个竞争的环境中,智能体( ...

  10. 对抗搜索之Alpha-Beta剪枝算法

    什么是对抗算法 为了解决信息确定.全局可观察.竞争对手轮流行动.输赢收益零和假设下的两人博弈问题而提出的一种算法.即零和博弈,所谓零和博弈是博弈论的一个概念,属非合作博弈.指参与博弈的各方,在严格竞争 ...

最新文章

  1. Python模拟弹道轨迹
  2. C++ 设计People类-1
  3. tornada-数据库
  4. rmi java 服务_javaweb项目启动时自动启动rmi服务器实例
  5. Android IPC机制(二)用Messenger进行进程间通信
  6. 删除mysql主键语句_MySQL主键添加/删除
  7. java第五章课后题_黑猴子的家:Java SE 练习题第五章
  8. 计算机管理教学 (cmi) 包括( )等功能,计算机管理教学(CMI)的未来
  9. 《pro Spring》学习笔记之Spring HTTP 远程方法调用
  10. 作为产品经理为什么选择开源GIS
  11. log4j2日志配置颜色
  12. Bugku CTF 抄错的字符 WP
  13. Python零基础学习笔记(三十三)—— 窗体的控制
  14. 五大通信设备厂商:华为存隐忧,中兴已掉队
  15. 【大厂面试合集】每日一刷——5. 字节跳动飞书部门2022后端工程师实习真题
  16. c语言中wait用法及意思,wait的用法总结大全
  17. vue时间戳和时间的相互转换
  18. Windows主机间批量操作的基本配置
  19. 书生云签10亿元、EB级订单,中国超融合迎来春天
  20. JAVA中excel文件导入日期变成数字解决方案

热门文章

  1. common,Google Guava,Guice
  2. TIC大咖说|氦氪云:用云服务推动智能家居发展
  3. 使用Ubuntu的Crontab定时任务需要注意的地方
  4. feathers ui 实现机制深入解析(feathers ui 源码解析-原创)
  5. sendmail接收,转发权限控制文件access配置详解
  6. Jps介绍以及解决jps无法查看某个已经启动的java进程问题
  7. Docker的思想来自于集装箱
  8. JWT、JWE、JWS 、JWK 都是什么鬼?还傻傻分不清?
  9. 强大,腾讯开源前后端接口开发工具!
  10. 华为某员工哀叹:过年回来后心态已崩,自己是亲戚中混的最差的