BZOJ 1770: [Usaco2009 Nov]lights 燈 [高斯消元XOR 搜索]
题意:
经典灯问题,求最少次数
本题数据不水,必须要暴搜自由元的取值啦
想了好久
然而我看到网上的程序都没有用记录now的做法,那样做遇到自由元应该可能会丢解吧...?
我的做法是把自由元保存下来,枚举的时候只枚举自由元
但这样没法最优性剪枝了
于是枚举的时候还是从n到1枚举,到i时如果i是主元这时候i的值已经可以算出来了,这样就可以最优性剪枝了
但注意主元i你不能用i这个方程,而要保存pivot[i]为i用了哪个方程
然后一个伪贪心策略是自由元先搜0
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <bitset>
using namespace std;
const int N=,INF=1e9;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
int n,m,u,v;
bitset<N> a[N];
int fe[N],now,pivot[N];
void Gauss(){
now=;
for(int i=;i<=n;i++){
int j=now;//printf("hi %d %d %d\n",i,now,a[now][i]==1);
while(j<=n&&!a[j][i]) j++;
if(j==n+) {fe[++fe[]]=i;continue;}
if(j!=now) swap(a[now],a[j]);
for(int j=;j<=n;j++)
if(j!=now&&a[j][i]) a[j]^=a[now];
pivot[i]=now;//printf("pivot %d\n",i);
now++;
}
}
int val[N],tot,ans=INF;
void pri(){
puts("free");
for(int i=;i<=fe[];i++) printf("fe %d %d %d\n",i,fe[i],val[i]);
puts("end");
}
int fir=;
void dfs(int d){
//printf("dfs %d %d\n",d,tot);
if(tot>=ans) return;
if(d==) ans=min(ans,tot);//if(fir==1) printf("tot %d\n",tot),pri(),fir=0;}
else if(pivot[d]){//printf("d %d\n",d);
int i=pivot[d];
int _=a[i][n+];
for(int j=;j<=fe[];j++)
if(a[i][fe[j]]) _^=val[fe[j]];
tot+=_;
dfs(d-);
tot-=_;
}else{
val[d]=;
dfs(d-);
val[d]=; tot++;
dfs(d-);
tot--;
}
}
int main(){
//freopen("in","r",stdin);
n=read();m=read();
for(int i=;i<=m;i++) u=read(),v=read(),a[u][v]=a[v][u]=;
for(int i=;i<=n;i++) a[i][n+]=a[i][i]=;
Gauss();
//for(int i=1;i<=n;i++) printf("a %d %d\n",i,a[i][n+1]==1);
//for(int i=1;i<=fe[0];i++) printf("fe %d %d\n",i,fe[i]);
dfs(n);
printf("%d",ans);
}
BZOJ 1770: [Usaco2009 Nov]lights 燈 [高斯消元XOR 搜索]的更多相关文章
- BZOJ 1770: [Usaco2009 Nov]lights 燈( 高斯消元 )
高斯消元解xor方程组...暴搜自由元+最优性剪枝 -------------------------------------------------------------------------- ...
- 【高斯消元】BZOJ 1770: [Usaco2009 Nov]lights 燈
Description 貝希和她的閨密們在她們的牛棚中玩遊戲.但是天不從人願,突然,牛棚的電源跳閘了,所有的燈都被關閉了.貝希是一個很膽小的女生,在伸手不見拇指的無盡的黑暗中,她感到驚恐,痛苦與絕望. ...
- bzoj 1770: [Usaco2009 Nov]lights 燈【高斯消元+dfs】
参考:https://blog.csdn.net/qq_34564984/article/details/53843777 可能背了假的板子-- 对于每个灯建立方程:与它相邻的灯的开关次数的异或和为1 ...
- BZOJ 1770: [Usaco2009 Nov]lights 燈
Description 一个图,对一个点进行操作会改变这个点及其相邻的点的状态,问全部变成黑色至少需要几次.数据保证有解. Sol Meet in middle. 我一开始写个高斯消元,发现有两个点过 ...
- 【BZOJ】1770 [Usaco2009 Nov]lights 燈
[算法]高斯消元-异或方程组 [题解]良心简中题意 首先开关顺序没有意义. 然后就是每个点选或不选使得最后得到全部灯开启. 也就是我们需要一种确定的方案,这种方案使每盏灯都是开启的. 异或中1可以完美 ...
- BZOJ1770:[USACO]lights 燈(高斯消元,DFS)
Description 貝希和她的閨密們在她們的牛棚中玩遊戲.但是天不從人願,突然,牛棚的電源跳閘了,所有的燈都被關閉了.貝希是一個很膽小的女生,在伸手不見拇指的無盡的黑暗中,她感到驚恐,痛苦與絕望. ...
- BZOJ 3105: [cqoi2013]新Nim游戏 [高斯消元XOR 线性基]
以后我也要用传送门! 题意:一些数,选择一个权值最大的异或和不为0的集合 终于有点明白线性基是什么了...等会再整理 求一个权值最大的线性无关子集 线性无关子集满足拟阵的性质,贪心选择权值最大的,用高 ...
- BZOJ 1923: [Sdoi2010]外星千足虫 [高斯消元XOR]
1923: [Sdoi2010]外星千足虫 对于 100%的数据,满足 N≤1,000,M≤2,000. 裸高斯消元解异或方程组 给定方程顺序要求用从上到下最少的方程,那么找主元时记录一下最远找到哪个 ...
- POJ1222 EXTENDED LIGHTS OUT 高斯消元 XOR方程组
http://poj.org/problem?id=1222 在学校oj用搜索写了一次,这次写高斯消元,haoi现场裸xor方程消元没写出来,真实zz. #include<iostream> ...
随机推荐
- Spring框架学习笔记(5)——自动装配
1.通过bean标签的autowire属性可以实现bean属性的自动装配. 创建一个新的Spring配置文件beans-autowire.xml,这里我们配置了3个bean,Address.Car.P ...
- Hadoop2.7.5+Hbase1.4.0完全分布式
Hadoop2.7.5+Hbase1.4.0完全分布式一.在介绍完全分布式之前先给初学者推荐两本书:<Hbase权威指南>偏理论<Hbase实战>实战多一些 二.在安装完全分布 ...
- SQL强化(三) 自定义函数
---恢复内容开始--- Oracle中我们可以通过自定义函数去做一些逻辑判断,这样可以减少查询语句,提高开发效率 create -- 创建自定义函数 or replace -- 有同名函数就替换, ...
- 在jquery中防止ajax重复提交
- Spider_Man_5.1 の Mongodb_安装
先安装: 环境Mac OS X 我是直接用brew来安装的,感觉这个包管理工具,很省心. 安装Homebrew:ruby -e "$(curl -fsSL https://raw.githu ...
- 算法-java代码实现快速排序
快速排序 对于一个int数组,请编写一个快速排序算法,对数组元素排序. 给定一个int数组A及数组的大小n,请返回排序后的数组. 测试样例: [1,2,3,5,2,3],6 [1,2,2,3,3,5] ...
- Thinkphp+Nginx(PHPstudy)下报的404错误,403错误解决
最近一个TP5的项目说放到Nginx下测试看看,下载个 PHPstudy,放到WWW下,配置好域名,直接给个报个404: 解决方法: 1.先在phpstudy下配置好域名目录指向项目下的public下 ...
- 【绘图技巧】ps快捷键的用法
Ctrl+N:新建画布 Ctrl+O:打开对话框 F: 在三种画布中切换 Z:缩放工具(临时) Ctrl+0:满画面显示 空格:切换到手(临时) Ctrl+":网 ...
- Angular 4 自定义组件封装遇见的一些事儿
你用Angular 吗? 一.介绍 说说封装Angular 组建过程中遇见的一些问题和感悟.用久了Angular,就会遇见很多坑,许多基于Angular开发的框架最喜欢做的事情就是封装组件,然后复用. ...
- java中的按位与运算
package scanner; public class SingleAnd { public static void main(String[] args) { int[] first = {10 ...