BZOJ 2466 [中山市选2009]树(高斯消元)
【题目链接】 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]树(高斯消元)的更多相关文章
- BZOJ 2466: [中山市选2009]树( 高斯消元 )
高斯消元解异或方程组...然后对自由元进行暴搜.树形dp应该也是可以的... ------------------------------------------------------------- ...
- BZOJ 2466 中山市选2009 树 高斯消元+暴力
题目大意:树上拉灯游戏 高斯消元解异或方程组,对于全部的自由元暴力2^n枚举状态,代入计算 这做法真是一点也不优雅... #include <cstdio> #include <cs ...
- 【BZOJ】2466: [中山市选2009]树 高斯消元解异或方程组
[题意]给定一棵树的灯,按一次x改变与x距离<=1的点的状态,求全0到全1的最少次数.n<=100. [算法]高斯消元解异或方程组 [题解]设f[i]=0/1表示是否按第i个点的按钮,根据 ...
- BZOJ 2466: [中山市选2009]树
Sol 树形DP. 听说有非常神奇的高斯消元的做法...orz... 然而我只会 \(O(n)\) 的树形DP. 首先一个点的状态只于他的父节点和子树有关,跟他 子树的子树 和 父亲的父亲 都没有任何 ...
- bzoj2466: [中山市选2009]树
同上一题.(应该可以树形dp,然而我不会... #include<cstdio> #include<cstring> #include<iostream> #inc ...
- 【BZOJ2466】[中山市选2009]树 树形DP
[BZOJ2466][中山市选2009]树 Description 图论中的树为一个无环的无向图.给定一棵树,每个节点有一盏指示灯和一个按钮.如果节点的按扭被按了,那么该节点的灯会从熄灭变为点亮(当按 ...
- 【bzoj2115】[Wc2011] Xor DFS树+高斯消元求线性基
题目描述 输入 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si,Ti ,Di,表示 Si 与Ti之间存在 一条权值为 Di的无向边. 图 ...
- 【bzoj4184】shallot 线段树+高斯消元动态维护线性基
题目描述 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏. 每个时刻她会给小葱一颗小葱苗或者是从小葱手里拿走一颗小葱苗,并且 让小葱从自己手中的小 ...
- 【dfs】【高斯消元】【异或方程组】bzoj1770 [Usaco2009 Nov]lights 燈 / bzoj2466 [中山市选2009]树
经典的开关灯问题. 高斯消元后矩阵对角线B[i][i]若是0,则第i个未知数是自由元(S个),它们可以任意取值,而让非自由元顺应它们,得到2S组解. 枚举自由元取0/1,最终得到最优解. 不知为何正着 ...
随机推荐
- windows程序设计.窗口.
第一个windows窗口 #include <windows.h> /* Displays "Hello, World!" in client area */ LRES ...
- java连接redis无法连接,报异常RedisConnectionException
不管是spring还是原生jedis连接redis,如果连不上多半是linux服务器的问题: 1 首先确保redis端口开放: 把6379或者redis的端口开放即可 2 redis.conf配置注释 ...
- springboot集成mybatis环境搭建以及实现快速开发微服务商品模块基本的增删改查!
之前学习了springboot和mybatis3的一些新特性,初步体会了springboot的强大(真的好快,,,,,),最近趁着复习,参考着以前学习的教程,动手写了一个springboot实战的小例 ...
- numpy之ones,array,asarray
from:http://blog.csdn.net/gobsd/article/details/56485177 numpy.ones() 废话少说直接上代码 >>> np.ones ...
- 读书笔记 effective c++ Item 28 不要返回指向对象内部数据(internals)的句柄(handles)
假设你正在操作一个Rectangle类.每个矩形可以通过左上角的点和右下角的点来表示.为了保证一个Rectangle对象尽可能小,你可能决定不把定义矩形范围的点存储在Rectangle类中,而是把它放 ...
- 四、Springboot Debug调试
描述: 在使用maven插件执行spring-boot:run进行启动的时候,如果设置的断点进不去,要进行以下的设置. 1.添加jvm参数配置 在spring-boot的maven插件加上jvmArg ...
- linux java配置
1.java配置 配置环境变量在/etc/profile下增加# set Java environmentJAVA_HOME=/usr/share/jdk1.6.0_43PATH=$JAVA_HOME ...
- 1.SpringBoot之Helloword 快速搭建一个web项目
背景: Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配 ...
- CCF CSP 201409-2 画图
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201409-2 画图 问题描述 在一个定义了直角坐标系的纸上,画一个(x1,y1)到(x2,y ...
- ansible安装过程遇到的问题
1.出现Error: ansible requires a json module, none found! SSH password: 192.168.24.15 | FAILED >> ...