【题目链接】 http://www.lydsy.com/JudgeOnline/problem.php?id=2466

【题目大意】

  给定一棵树,每个节点有一盏指示灯和一个按钮。如果节点的按扭被按了,
  那么该节点的灯会从熄灭变为点亮(当按之前是熄灭的),或者从点亮到熄灭
  并且该节点的直接邻居也发生同样的变化。开始的时候,所有的指示灯都是熄灭的。
  请编程计算最少要按多少次按钮,才能让所有节点的指示灯变为点亮状态。

【题解】

  高斯消元枚举自由变元回代。

【代码】

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
namespace Gauss{
const int N=110,MOD=2,INF=1e9;
int a[N][N],ans[N];
bool isFreeX[N];
int inv(int a,int m){return(a==1?1:inv(m%a,m)*(m-m/a)%m);}
int getAns(int n,int m,int r){
int res=0;
for(int i=r-1;~i;i--){
for(int j=0;j<m;j++){
if(!a[i][j])continue;
ans[j]=a[i][m];
for(int k=j+1;k<m;k++){
ans[j]-=a[i][k]*ans[k];
ans[j]%=MOD;
if(ans[j]<0)ans[j]+=MOD;
}
ans[j]=ans[j]*inv(a[i][j],MOD)%MOD;
break;
}
}
for(int i=0;i<m;i++)res+=ans[i];
return res;
}
int gauss(int n,int m){
for(int i=0;i<m;i++)isFreeX[i]=0;
int r=0,c=0;
for(;r<n&&c<m;r++,c++){
int maxR=r;
for(int i=r+1;i<n;i++)if(abs(a[i][c])>abs(a[maxR][c]))maxR=i;
if(maxR!=r)swap(a[maxR],a[r]);
if(!a[r][c]){r--;isFreeX[c]=1;continue;}
for(int i=r+1;i<n;i++){
if(a[i][c]){
int delta=a[i][c]*inv(a[r][c],MOD);
for(int j=c;j<=m;j++){
a[i][j]-=delta*a[r][j];
a[i][j]%=MOD;
if(a[i][j]<0)a[i][j]+=MOD;
}
}
}
}
for(int i=r;i<n;i++)if(a[i][m])return -1;
return r;
}
// 模2枚举自由变元
int getMinAns(int n,int m,int r){
int res=INF,freeX=m-r;
for(int s=0;s<1<<freeX;s++){
if(__builtin_popcount(s)>=res)continue;
int cnt=0;
for(int j=0;j<m;j++){
if(isFreeX[j]){
ans[j]=s>>cnt&1;
++cnt;
}
}res=min(res,getAns(n,m,r));
}return res;
}
}
int n,x,y;
int main(){
while(~scanf("%d",&n),n){
using namespace Gauss;
memset(a,0,sizeof(a));
for(int i=1;i<n;i++){
scanf("%d%d",&x,&y);
a[x-1][y-1]=1;
a[y-1][x-1]=1;
}
for(int i=0;i<n;i++)a[i][i]=a[i][n]=1;
int r=gauss(n,n);
printf("%d\n",getMinAns(n,n,r));
}return 0;
}

BZOJ 2466 [中山市选2009]树(高斯消元)的更多相关文章

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

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

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

    题目大意:树上拉灯游戏 高斯消元解异或方程组,对于全部的自由元暴力2^n枚举状态,代入计算 这做法真是一点也不优雅... #include <cstdio> #include <cs ...

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

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

  4. BZOJ 2466: [中山市选2009]树

    Sol 树形DP. 听说有非常神奇的高斯消元的做法...orz... 然而我只会 \(O(n)\) 的树形DP. 首先一个点的状态只于他的父节点和子树有关,跟他 子树的子树 和 父亲的父亲 都没有任何 ...

  5. bzoj2466: [中山市选2009]树

    同上一题.(应该可以树形dp,然而我不会... #include<cstdio> #include<cstring> #include<iostream> #inc ...

  6. 【BZOJ2466】[中山市选2009]树 树形DP

    [BZOJ2466][中山市选2009]树 Description 图论中的树为一个无环的无向图.给定一棵树,每个节点有一盏指示灯和一个按钮.如果节点的按扭被按了,那么该节点的灯会从熄灭变为点亮(当按 ...

  7. 【bzoj2115】[Wc2011] Xor DFS树+高斯消元求线性基

    题目描述 输入 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si,Ti ,Di,表示 Si 与Ti之间存在 一条权值为 Di的无向边. 图 ...

  8. 【bzoj4184】shallot 线段树+高斯消元动态维护线性基

    题目描述 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏. 每个时刻她会给小葱一颗小葱苗或者是从小葱手里拿走一颗小葱苗,并且 让小葱从自己手中的小 ...

  9. 【dfs】【高斯消元】【异或方程组】bzoj1770 [Usaco2009 Nov]lights 燈 / bzoj2466 [中山市选2009]树

    经典的开关灯问题. 高斯消元后矩阵对角线B[i][i]若是0,则第i个未知数是自由元(S个),它们可以任意取值,而让非自由元顺应它们,得到2S组解. 枚举自由元取0/1,最终得到最优解. 不知为何正着 ...

随机推荐

  1. Spring编程式和声明式事务实例讲解

    Java面试通关手册(Java学习指南):https://github.com/Snailclimb/Java_Guide 历史回顾: 可能是最漂亮的Spring事务管理详解 Spring事务管理 S ...

  2. linux快速复制大量小文件方法 nc+tar【转】

    1,在需要对大量小文件进行移动或复制时,用cp.mv都会显得很没有效率,可以用tar先压缩再解压缩的方式.  2,在网络环境中传输时,可以再结合nc命令,通过管道和tcp端口进行传输.  nc和tar ...

  3. mysql高可用架构 -> MHA环境准备-02

    环境准备 环境检查(三个测试节点的环境都应该是一样的,只有ip不同) [root@db01 bin]# cat /etc/redhat-release //系统版本 CentOS Linux rele ...

  4. MySQL -- SQL 语句

    一. 数据库(Database)操作 创建数据库 create database 数据库名 create database 数据库名 character set 字符集 查看数据库 查看数据库服务器中 ...

  5. cocos2d-x 日志...

    cocos2d-x  日志... http://blog.csdn.net/themagickeyjianan/article/details/39008297http://blog.csdn.net ...

  6. Jmeter 接口测试-请求 Headers 与传参方式

    1.添加信息表头. 注意:1.使用Parameters时,Content-Type要么不传,要么传application/x-www-form-urlencoded,因为不传时默认值就是applica ...

  7. .Net程序集强签名详解

    强签名: 1. 可以将强签名的dll注册到GAC,不同的应用程序可以共享同一dll. 2. 强签名的库,或者应用程序只能引用强签名的dll,不能引用未强签名的dll,但是未强签名的dll可以引用强签名 ...

  8. 从源码分析StringUtils包

    今天用到StringUtils.join方法,闲来无聊,看了下源码 当然不可能自己分析,你傻啊,在这里推荐一个别人分析的; http://blog.csdn.net/baidu_31071595/ar ...

  9. 机器学习 Python实践-K近邻算法

    机器学习K近邻算法的实现主要是参考<机器学习实战>这本书. 一.K近邻(KNN)算法 K最近邻(k-Nearest Neighbour,KNN)分类算法,理解的思路是:如果一个样本在特征空 ...

  10. Unix IPC之读写锁

    linux中读写锁的rwlock介绍 读写锁比mutex有更高的适用性,可以多个线程同时占用读模式的读写锁,但是只能一个线程占用写模式的读写锁: 1,当读写锁是写加锁状态时, 在这个锁被解锁之前, 所 ...