对于每个灯,我们用一个变量表示其决策,xu=0表示不选,xu=1表示选。因为每个灯最后必须都亮,所以每个等都对应一个异或方程。

解这个异或方程组,有几种情况:

  1、存在唯一解(得到的上三角系数矩阵的主对角线上的元素全部为1)

  2、无解(存在某行系数全为0,但等式右边不为0)

  3、存在v个自由元(即主对角线上有v个0,我们枚举每个自由元的取值,有2v种情况)

我们统计所有合法解的最小的值作为答案。

 /**************************************************************
Problem: 2466
User: idy002
Language: C++
Result: Accepted
Time:16 ms
Memory:1352 kb
****************************************************************/ #include <cstdio>
#include <cstring>
#include <iostream>
#define N 100
#define oo 0x3f3f3f3f
using namespace std; int n, ans;
int head[N], dest[N<<], next[N<<], etot;
int aa[N][N+], bb[N][N+], cc[N];
int stk[N], top; void init() {
memset( head, , sizeof(head) );
etot = ;
top = ;
ans = oo;
}
void adde( int u, int v ) {
etot++;
next[etot] = head[u];
dest[etot] = v;
head[u] = etot;
}
void print() {
for( int i=; i<n; i++ ) {
for( int j=; j<=n; j++ )
printf( "%d ", aa[i][j] );
printf( "\n" );
}
printf( "\n" );
}
void gauss() {
for( int i=; i<n; i++ ) {
for( int j=i; j<n; j++ ) {
if( aa[j][i]== ) {
for( int k=i; k<=n; k++ )
swap( aa[i][k], aa[j][k] );
break;
}
}
if( aa[i][i]== ) {
for( int j=i+; j<n; j++ ) {
if( aa[j][i]== ) {
for( int k=i; k<=n; k++ )
aa[j][k] ^= aa[i][k];
}
}
} else {
stk[top++] = i;
}
// print();
}
}
int calc() {
memcpy( bb, aa, sizeof(aa) );
int rt = ;
for( int i=n-; i>=; i-- ) {
bool a=bb[i][i], b=bb[i][n];
if( a ) {
if( b ) {
rt++;
for( int j=i-; j>=; j-- )
bb[j][n] ^= bb[j][i];
} else {
// do nothing
}
} else {
if( b ) {
return oo;
} else {
if( cc[i] ) {
rt++;
for( int j=i-; j>=; j-- )
bb[j][n] ^= bb[j][i];
}
}
}
}
return rt;
}
void dfs( int i ) {
if( i==top ) {
int tans = calc();
if( ans>tans ) ans=tans;
return;
}
cc[stk[i]]=;
dfs(i+);
cc[stk[i]]=;
dfs(i+);
}
int main() {
while( scanf("%d",&n)== && n!= ) {
init();
for( int t=,u,v; t<n; t++ ) {
scanf( "%d%d", &u, &v );
u--, v--;
adde(u,v);
adde(v,u);
}
memset( aa, , sizeof(aa) );
for( int u=; u<n; u++ ) {
aa[u][u] = ;
for( int t=head[u]; t; t=next[t] ) {
int v=dest[t];
aa[v][u] = ;
}
}
for( int v=; v<n; v++ )
aa[v][n] = ;
gauss();
dfs();
printf( "%d\n", ans );
}
}

bzoj 2466 异或方程组的更多相关文章

  1. 【BZOJ】2466: [中山市选2009]树 高斯消元解异或方程组

    [题意]给定一棵树的灯,按一次x改变与x距离<=1的点的状态,求全0到全1的最少次数.n<=100. [算法]高斯消元解异或方程组 [题解]设f[i]=0/1表示是否按第i个点的按钮,根据 ...

  2. bzoj千题计划187:bzoj1770: [Usaco2009 Nov]lights 燈 (高斯消元解异或方程组+枚举自由元)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1770 a[i][j] 表示i对j有影响 高斯消元解异或方程组 然后dfs枚举自由元确定最优解 #in ...

  3. bzoj千题计划105:bzoj3503: [Cqoi2014]和谐矩阵(高斯消元法解异或方程组)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3503 b[i][j] 表示i对j是否有影响 高斯消元解异或方程组 bitset优化 #include ...

  4. BZOJ.1923.[SDOI2010]外星千足虫(高斯消元 异或方程组 bitset)

    题目链接 m个方程,n个未知量,求解异或方程组. 复杂度比较高,需要借助bitset压位. 感觉自己以前写的(异或)高斯消元是假的..而且黄学长的写法都不需要回代. //1100kb 324ms #i ...

  5. 高斯消元法求解异或方程组: cojs.tk 539.//BZOJ 1770 牛棚的灯

    高斯消元求解异或方程组: 比较不错的一篇文章:http://blog.sina.com.cn/s/blog_51cea4040100g7hl.html cojs.tk  539. 牛棚的灯 ★★☆   ...

  6. BZOJ 1923 SDOI2010 外星千足虫 异或方程组+bitset

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1923 懒得贴题目了......这就是解一个异或方程组的裸题...... YY了一下异或方程 ...

  7. 【BZOJ 1770 】 [Usaco2009 Nov]lights 燈 dfs+异或方程组

    这道题明显是异或方程组,然而解不一定唯一他要的是众多解中解为1的数的最小值,这个时候我们就需要dfs了我们dfs的时候就是枚举其有不确定解的数上选0或1从而推知其他解,由于我们dfs的时候先0后1,虽 ...

  8. BZOJ 2466: [中山市选2009]树( 高斯消元 )

    高斯消元解异或方程组...然后对自由元进行暴搜.树形dp应该也是可以的... ------------------------------------------------------------- ...

  9. 【HDU 5833】Zhu and 772002(异或方程组高斯消元)

    300个最大质因数小于2000的数,选若干个它们的乘积为完全平方数有多少种方案. 合法方案的每个数的质因数的个数的奇偶值异或起来为0. 比如12=2^2*3,对应的奇偶值为01(2的个数是偶数为0,3 ...

随机推荐

  1. Linux内核跟踪之ring buffer的实现【转】

      转自:http://blog.chinaunix.net/uid-20543183-id-1930845.html ---------------------------------------- ...

  2. python3 asyncio官方文档中文版

    事件循环基类 事件循环基类 事件循环是由asyncio提供的核心执行装置.它提供了多种服务,包括: 注册.执行和关闭延时调用(超时) 为各种通信创建客户端和服务端传输 为一个外部程序通信启动子进程和相 ...

  3. linux文件管理 -> vim编辑总结

    vi和vim命令是linux中强大的文本编辑器, 由于Linux系统一切皆文件,而配置一个服务就是在修改其配置文件的参数.vim编辑器是运维工程师必须掌握的一个工具, 没有它很多工作都无法完成.vim ...

  4. mac上安装完成node,就升级好了npm,之后的设置

    1.打开终端输入: npm config list 找到npmrc globalconfig /usr/local/etc/npmrc 2.打开npmrc sudo vim /usr/local/et ...

  5. js实现图片懒加载

    大型购物网站都会采用图片懒加载技术来优化网站首页打开速度,以提高用户体验,那么具体是怎么实现的呢,我们一探究竟. html结构(div包裹一层用来显示背景图片,等待图片加载完成后,显示真实图片) &l ...

  6. delphi TComponent类 2

    来自:http://blog.csdn.net/lailai186/article/details/7442385 ------------------------------------------ ...

  7. Maven使用—拷贝Maven依赖jar包到指定目录

    https://blog.csdn.net/u013514928/article/details/77930183

  8. Hive(五)数据类型与库表操作以及中文乱码

    一.数据类型 1.基本数据类型 Hive 支持关系型数据中大多数基本数据类型 类型 描述 示例 boolean true/false TRUE tinyint 1字节的有符号整数 -128~127 1 ...

  9. ASP.NET:MVC模板化机制

    模版化的核心是定制ViewEngine.完整的模板化必须实现3个功能:1.网站的多套模版(razor)支持 2.模版的多样式(style)支持. 3.按需实现模版:没有实现的加载默认模版. 我们除了要 ...

  10. spring boot之使用通用Mapper批量添加数据

    通用Mapper是一款针对mybatis进行扩展的轻量级组件,使用起来非常方便.当调用其针对mysql进行批量添加数据的方法时,发现报错,仔细研究了一番,发现是在使用通用Mapper上出现了问题.下面 ...