bzoj 2466 异或方程组
对于每个灯,我们用一个变量表示其决策,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 异或方程组的更多相关文章
- 【BZOJ】2466: [中山市选2009]树 高斯消元解异或方程组
[题意]给定一棵树的灯,按一次x改变与x距离<=1的点的状态,求全0到全1的最少次数.n<=100. [算法]高斯消元解异或方程组 [题解]设f[i]=0/1表示是否按第i个点的按钮,根据 ...
- bzoj千题计划187:bzoj1770: [Usaco2009 Nov]lights 燈 (高斯消元解异或方程组+枚举自由元)
http://www.lydsy.com/JudgeOnline/problem.php?id=1770 a[i][j] 表示i对j有影响 高斯消元解异或方程组 然后dfs枚举自由元确定最优解 #in ...
- bzoj千题计划105:bzoj3503: [Cqoi2014]和谐矩阵(高斯消元法解异或方程组)
http://www.lydsy.com/JudgeOnline/problem.php?id=3503 b[i][j] 表示i对j是否有影响 高斯消元解异或方程组 bitset优化 #include ...
- BZOJ.1923.[SDOI2010]外星千足虫(高斯消元 异或方程组 bitset)
题目链接 m个方程,n个未知量,求解异或方程组. 复杂度比较高,需要借助bitset压位. 感觉自己以前写的(异或)高斯消元是假的..而且黄学长的写法都不需要回代. //1100kb 324ms #i ...
- 高斯消元法求解异或方程组: cojs.tk 539.//BZOJ 1770 牛棚的灯
高斯消元求解异或方程组: 比较不错的一篇文章:http://blog.sina.com.cn/s/blog_51cea4040100g7hl.html cojs.tk 539. 牛棚的灯 ★★☆ ...
- BZOJ 1923 SDOI2010 外星千足虫 异或方程组+bitset
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1923 懒得贴题目了......这就是解一个异或方程组的裸题...... YY了一下异或方程 ...
- 【BZOJ 1770 】 [Usaco2009 Nov]lights 燈 dfs+异或方程组
这道题明显是异或方程组,然而解不一定唯一他要的是众多解中解为1的数的最小值,这个时候我们就需要dfs了我们dfs的时候就是枚举其有不确定解的数上选0或1从而推知其他解,由于我们dfs的时候先0后1,虽 ...
- BZOJ 2466: [中山市选2009]树( 高斯消元 )
高斯消元解异或方程组...然后对自由元进行暴搜.树形dp应该也是可以的... ------------------------------------------------------------- ...
- 【HDU 5833】Zhu and 772002(异或方程组高斯消元)
300个最大质因数小于2000的数,选若干个它们的乘积为完全平方数有多少种方案. 合法方案的每个数的质因数的个数的奇偶值异或起来为0. 比如12=2^2*3,对应的奇偶值为01(2的个数是偶数为0,3 ...
随机推荐
- plsql链接数据库配置
一. 目录结构 D:\install\PLSQL |-- instantclient_11_2 |-- tnsnames.ora |-- PLSQL ...
- PATH变量重复
命令: export PATH=$(echo $PATH | tr : "\n"| sort | uniq | tr "\n" :) Code: awk -F: ...
- [转]在C#程序设计中使用Win32类库
http://blog.163.com/j_yd168/blog/static/496797282008611326218/ C# 用户经常提出两个问题:“我为什么要另外编写代码来使用内置于 ...
- 简单的搭mysql开发环境
所需软件 环境win8 64bit mysql5.7.16winx64.zip mysql-workbench-community-6.3.5-win32.zip 安装完了之后到mysql/bin下 ...
- mac 下安装pip
pip是常用的Python包管理工具,类似于Java的maven.用python的同学,都离不开pip. 在新mac中想用home-brew安装pip时,遇到了一些小问题: bogon:~ wangl ...
- android studio实现Intent通信-------牛刀小试
概述: 本博文实现一种小程序,两个Activity单向通信,主从关系,MainActivty 页面布局一个EditText+Button,实现逻辑是单击按钮将信息发送给另外一个DisplayMessa ...
- python之assert断言
assert只是一个检查,为真不做任何事,不为真时,抛出异常,并包含错误信息 1.根据布尔值判断 2.判断是否相等 3.返回值是否为空 4.是否包含某值 x in y 其他方法,可以参考http:// ...
- 题解 UVA10048 【Audiophobia】
这是一道很神奇的题 什么都不卡,就卡c++11(所以评测时要换成c++). 怎么说呐,其实就是跑一个弗洛依德,求图上两点间最大权值最小的路径,输出最大权值最小. P.S.本题n很小,直接floyd变形 ...
- 洛谷P1186玛丽卡
传送门啦 先跑一遍最短路,将最短路的路径记录下来,然后枚举每一条最短路的边,将其断掉,记录此时的1-n的时间,取其中最大的一个时间即为所求. (通过 $ cut[][] $ 和 $ f[] $ 进行操 ...
- Web 2.0应用客户端性能问题十大根源《转载》
前言 Web 2.0应用的推广为用户带来了全新的体验,同时也让开发人员更加关注客户端性能问题.最近,资深Web性能诊断专家.知名工具dynatrace的创始人之一Andreas Grabner根据自己 ...