【题目链接】 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. Go net/http获取body中json格式数据

    Go net/http获取body中json格式数据 package main import ( "encoding/json" "fmt" "io/ ...

  2. 富文本存储型XSS的模糊测试之道

    富文本存储型XSS的模糊测试之道 凭借黑吧安全网漏洞报告平台的公开案例数据,我们足以管中窥豹,跨站脚本漏洞(Cross-site Script)仍是不少企业在业务安全风险排查和修复过程中需要对抗的“大 ...

  3. PCA主成分分析理解

    一.理论概述 1)问题引出 先看如下几张图: 从上述图中可以看出,如果将3个图的数据点投影到x1轴上,图1的数据离散度最高,图3其次,图2最小.数据离散性越大,代表数据在所投影的维度上具有越高的区分度 ...

  4. HADOOP百度云资料

    百度云下载地址: 链接:http://pan.baidu.com/s/1pL56hkv 密码:u4h3 解压密码:www.mukedaba.com

  5. Ubuntu下安装arm-linux-gnueabi-xxx编译器【转】

    转自:http://blog.csdn.net/real_myth/article/details/51481639 from: http://www.linuxdiyf.com/linux/1948 ...

  6. Git的安装和使用(Linux)【转】

    转自:http://my.oschina.net/fhd/blog/354685 Git诞生于Linux平台并作为版本控制系统率先服务于Linux内核,因此在Linux上安装Git是非常方便的.可以通 ...

  7. redis数据淘汰机制

    volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用 的数据淘汰 volatile-ttl:从已设置过期时间的数据集(server.db[i ...

  8. Nagios Openstack Plugin

    Some simple example for checking Openstack services check nova service list #!/bin/sh export OS_PROJ ...

  9. Python模块:Random(未完待续)

    本文基于Python 3.6.5的官文random编写. random模块简介 random为各种数学分布算法(distributions)实现了伪随机数生成器. 对于整数,是从一个范围中均匀选择(u ...

  10. python网络编程-Select\Poll\Epoll异步IO

    首先列一下,sellect.poll.epoll三者的区别 select select最早于1983年出现在4.2BSD中,它通过一个select()系统调用来监视多个文件描述符的数组,当select ...