【题目链接】 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. mogodb的安装与配置

    下载:https://www.mongodb.com/https://www.mongodb.com/ 安装:一直next,中间选择custom,选择自己的安装路径,最后安装成功. 配置:打开安装好的 ...

  2. solr简介——(九)

    下载:     http://archive.apache.org/dist/lucene/solr/ 1.什么是solr Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lu ...

  3. 【算法学习】【洛谷】cdq分治 & P3810 三维偏序

    cdq是何许人也?请参看这篇:https://wenku.baidu.com/view/3b913556fd0a79563d1e7245.html. 在这篇论文中,cdq提出了对修改/询问型问题(Mo ...

  4. aarch64_g5

    gtkmm24-devel-2.24.5-2.fc26.aarch64.rpm 2017-02-11 18:17 620K fedora Mirroring Project gtkmm24-docs- ...

  5. static, const 和 static const 变量的初始化问题

    const 常量的在超出其作用域的时候会被释放,但是 static 静态变量在其作用域之外并没有释放,只是不能访问. static 修饰的是静态变量,静态函数.对于类来说,静态成员和静态函数是属于整个 ...

  6. MySQL 联合查询

    联合查询:将多次查询(多条select语句), 在记录上进行拼接(字段不会增加) 基本语法:多条select语句构成: 每一条select语句获取的字段数必须严格一致(但是字段类型无关) 语法 Sel ...

  7. python 写入execl记录

    记录代码中关于写execl的操作 # 创建execl workbook = xlwt.Workbook(encoding='utf8') # 创建样式实例 style = xlwt.XFStyle() ...

  8. scala可变长度参数(转)

    可变长度参数 Scala 允许你指明函数的最后一个参数可以是重复的.这可以允许客户向函数传入可变长度参数列表.想要标注一个重复参数,在参数的类型之后放一个星号.例如: scala> def ec ...

  9. Python全局变量和局部变量

    全局变量和局部变量 定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域. 局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问.调用函数时,所有在函数内声明的变量 ...

  10. 链家2018春招C/C++开发实习生在线考试编程题

    题目一 题解:该题目意思就是让你输入n组数据,然后求并集,利用STL容器set集合的特性:元素不重复存储,我们可以很轻易得出答案 #include <iostream> #include ...