bzoj 2466 异或方程组

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

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

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

  2、存在v个自由元(即主对角线上有v个0)

    我们枚举每个自由元的取值,有2v种情况,每种情况又分为

      2.1、合法    

      2.2、不合法   (出现除以0的情况)

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

  1 /**************************************************************
  2     Problem: 2466
  3     User: idy002
  4     Language: C++
  5     Result: Accepted
  6     Time:16 ms
  7     Memory:1352 kb
  8 ****************************************************************/
  9
 10 #include <cstdio>
 11 #include <cstring>
 12 #include <iostream>
 13 #define N 100
 14 #define oo 0x3f3f3f3f
 15 using namespace std;
 16
 17 int n, ans;
 18 int head[N], dest[N<<1], next[N<<1], etot;
 19 int aa[N][N+1], bb[N][N+1], cc[N];
 20 int stk[N], top;
 21
 22 void init() {
 23     memset( head, 0, sizeof(head) );
 24     etot = 0;
 25     top = 0;
 26     ans = oo;
 27 }
 28 void adde( int u, int v ) {
 29     etot++;
 30     next[etot] = head[u];
 31     dest[etot] = v;
 32     head[u] = etot;
 33 }
 34 void print() {
 35     for( int i=0; i<n; i++ ) {
 36         for( int j=0; j<=n; j++ )
 37             printf( "%d ", aa[i][j] );
 38         printf( "\n" );
 39     }
 40     printf( "\n" );
 41 }
 42 void gauss() {
 43     for( int i=0; i<n; i++ ) {
 44         for( int j=i; j<n; j++ ) {
 45             if( aa[j][i]==1 ) {
 46                 for( int k=i; k<=n; k++ )
 47                     swap( aa[i][k], aa[j][k] );
 48                 break;
 49             }
 50         }
 51         if( aa[i][i]==1 ) {
 52             for( int j=i+1; j<n; j++ ) {
 53                 if( aa[j][i]==1 ) {
 54                     for( int k=i; k<=n; k++ )
 55                         aa[j][k] ^= aa[i][k];
 56                 }
 57             }
 58         } else {
 59             stk[top++] = i;
 60         }
 61 //      print();
 62     }
 63 }
 64 int calc() {
 65     memcpy( bb, aa, sizeof(aa) );
 66     int rt = 0;
 67     for( int i=n-1; i>=0; i-- ) {
 68         bool a=bb[i][i], b=bb[i][n];
 69         if( a ) {
 70             if( b ) {
 71                 rt++;
 72                 for( int j=i-1; j>=0; j-- )
 73                     bb[j][n] ^= bb[j][i];
 74             } else {
 75                 //  do nothing
 76             }
 77         } else {
 78             if( b ) {
 79                 return oo;
 80             } else {
 81                 if( cc[i] ) {
 82                     rt++;
 83                     for( int j=i-1; j>=0; j-- )
 84                         bb[j][n] ^= bb[j][i];
 85                 }
 86             }
 87         }
 88     }
 89     return rt;
 90 }
 91 void dfs( int i ) {
 92     if( i==top ) {
 93         int tans = calc();
 94         if( ans>tans ) ans=tans;
 95         return;
 96     }
 97     cc[stk[i]]=0;
 98     dfs(i+1);
 99     cc[stk[i]]=1;
100     dfs(i+1);
101 }
102 int main() {
103     while( scanf("%d",&n)==1 && n!=0 ) {
104         init();
105         for( int t=1,u,v; t<n; t++ ) {
106             scanf( "%d%d", &u, &v );
107             u--, v--;
108             adde(u,v);
109             adde(v,u);
110         }
111         memset( aa, 0, sizeof(aa) );
112         for( int u=0; u<n; u++ ) {
113             aa[u][u] = 1;
114             for( int t=head[u]; t; t=next[t] ) {
115                 int v=dest[t];
116                 aa[v][u] = 1;
117             }
118         }
119         for( int v=0; v<n; v++ )
120             aa[v][n] = 1;
121         gauss();
122         dfs(0);
123         printf( "%d\n", ans );
124     }
125 }

时间: 2024-10-07 06:13:33

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

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

高斯消元求解异或方程组: 比较不错的一篇文章:http://blog.sina.com.cn/s/blog_51cea4040100g7hl.html cojs.tk  539. 牛棚的灯 ★★☆   输入文件:lights.in   输出文件:lights.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] 贝希和她的闺密们在她们的牛棚中玩游戏.但是天不从人愿,突然,牛棚的电源跳闸了,所有的灯都被关闭了.贝希是一个很胆小的女生,在伸手不见拇指的无尽的黑暗中,她感到惊

BZOJ 3563 DZY Loves Chinese / BZOJ 3569 DZY Loves Chinese II 随机化+高斯消元解异或方程组

题目大意:给出一个无向图,问删掉k条边的时候,图是否联通. 思路:虽然我把这两个题放在了一起,但是其实这两个题可以用完全不同的两个解法来解决. 第一个题其实是DZY出错了...把每次的边数也异或了,那就直接用这个性质一个一个往后推就行了..最后一个暴力求一下.. 第二个题才是本意啊. 听到做法的时候我惊呆了.. 首先是将整个图中拆出一个树,那么所有边就分为树边和非树边.将所有非树边都加一个随机权值.树边的权值是所有能够覆盖它的非树边的权值的异或和. 把整个图拆开的充要条件是拆掉一条树边,同时将所

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

题目链接 m个方程,n个未知量,求解异或方程组. 复杂度比较高,需要借助bitset压位. 感觉自己以前写的(异或)高斯消元是假的..而且黄学长的写法都不需要回代. //1100kb 324ms #include <cstdio> #include <cctype> #include <bitset> #include <algorithm> const int N=1004,M=2004; int n,m; char s[N]; std::bitset&l

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

高斯消元解异或方程组...然后对自由元进行暴搜.树形dp应该也是可以的... -------------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<bitset> using namespace std; const int ma

【BZOJ2466】【中山市选2009】树 高斯消元解异或方程组

广告: #include <stdio.h> int main() { puts("转载请注明出处[vmurder]谢谢"); puts("网址:blog.csdn.net/vmurder/article/details/44356273"); } 题解: 参照此题解,也是我写的,俩题一样. [POJ1681]Painter's Problem 高斯消元,求最小∑系数的异或方程组 代码: #include <cmath> #include &

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

300个最大质因数小于2000的数,选若干个它们的乘积为完全平方数有多少种方案. 合法方案的每个数的质因数的个数的奇偶值异或起来为0. 比如12=2^2*3,对应的奇偶值为01(2的个数是偶数为0,3的个数是奇数为1),3的对应奇偶值为01,于是12*3是完全平方数. 然后异或方程组就是: a11x1+a12x2+...+a1nxn=0 a21x1+a22x2+...+a2nxn=0 ... an1x1+an2x2+...+annxn=0 aij:第i个质数(2000内有303个质数)在第j个数

【POJ1222】EXTENDED LIGHTS OUT 高斯消元、解异或方程组

#include <stdio.h> int main() { puts("转载请注明出处[vmurder]谢谢"); puts("网址:blog.csdn.net/vmurder/article/details/43481693"); } 题意: 多组数据. 有个5*6的图,然后你要对某些位置进行操作,使得最后灯的状态如图. 操作:这个灯位置的上下左右以及自己这五盏灯状态都取反. 然后输出操作. 说实话什么亮灭什么我全都没考虑. 直接瞎写一遍就PE了,

BZOJ 2466 中山市选2009 树 高斯消元+暴力

题目大意:树上拉灯游戏 高斯消元解异或方程组,对于全部的自由元暴力2^n枚举状态,代入计算 这做法真是一点也不优雅... #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define M 110 using namespace std; int n,m; int f[M][M],is_free[M],tot; int ans[M],cnt; void

【poj1830-开关问题】高斯消元求解异或方程组

第一道高斯消元题目~ 题目:有N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关相关联的开关也会相应地发生变化,即这些相联系的开关的状态如果原来为开就变为关,如果为关就变为开.你的目标是经过若干次开关操作后使得最后N个开关达到一个特定的状态.对于任意一个开关,最多只能进行一次开关操作.你的任务是,计算有多少种可以达到指定状态的方法.(不计开关操作的顺序)0<=N<=29 我们用样例来模拟一下: 我的高斯消元求解异或方程组模版: 1 int gauss