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

时间:2021-11-27 11:14:05

【题目链接】 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&colon; &lbrack;中山市选2009&rsqb;树&lpar; 高斯消元 &rpar;

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

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

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

  3. 【BZOJ】2466&colon; &lbrack;中山市选2009&rsqb;树 高斯消元解异或方程组

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

  4. BZOJ 2466&colon; &lbrack;中山市选2009&rsqb;树

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

  5. bzoj2466&colon; &lbrack;中山市选2009&rsqb;树

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

  6. 【BZOJ2466】&lbrack;中山市选2009&rsqb;树 树形DP

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

  7. 【bzoj2115】&lbrack;Wc2011&rsqb; Xor DFS树&plus;高斯消元求线性基

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

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

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

  9. 【dfs】【高斯消元】【异或方程组】bzoj1770 &lbrack;Usaco2009 Nov&rsqb;lights 燈 &sol; bzoj2466 &lbrack;中山市选2009&rsqb;树

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

随机推荐

  1. IDEA插件

    Key Promoter 快捷键提示插件,帮助你快速记住快捷键.当你用鼠标完成某功能时,它会指示有相应的快捷键来完成刚才的功能,同时指导你为经常重复的操作建立快捷键. SerialVersionUID ...

  2. Python第一模块

    一.Python简介 二.Python种类 三.Python环境  windows: 1.需要配置环境变量 2.更新:卸载重装 linux:1.常用命令: 查看默认Python版本 Python -V ...

  3. JAVA JDK的动态代理反射实现

    动态代理类使用到了一个接口InvocationHandler和一个代理类Proxy ,这两个类配合使用实现了动态代理的功能. 什么是动态代理呢?  普通代理类是指: 给每个具体类写一个代理类,以后要使 ...

  4. PowerDesigner反向生成Mysql数据原型

    PowerDesigner反向生成Mysql数据原型 注意事项: (1)JVM 要32位的. (2)需配置JAVA_HOME环境变量指向所需JVM. (3)需配置CLASSPATH环境变量执行 MyS ...

  5. 【Android 界面效果38】android&colon;inputType常用取值

    <EditText android:layout_width="fill_parent" android:layout_height="wrap_content&q ...

  6. 源自梦想 自定义ViewGroup的整理&lowbar;2

    Android项目: 1.准备资源图片.图片放到hdip里和mdip里对想过的影响:对于320*480的模拟器,默认去mdip里去找图片资源,拿过来的图片可以直接用,清晰度不变.要是所要找的图片在hd ...

  7. WinForms 新窗体后台打开完美的解决

    最近在做浏览器开发时,想要实现 IE 6那种多窗体,又允许后台打开而不抢占视野的方式. WinForms 应用程序中想要后台打开一个新的窗体,而不(抢焦).(遮挡)目前窗体. 需要注意的是,SW_SH ...

  8. HTML5 javascript实现音乐播放器

    准备毕业了,感觉好多东西都没学会,太多太多想学的知识,有种求知若渴的状态. 四年的大学就剩下一个多月了,无论将来多么困难,这条路是自己选的,走就要走的精彩! 自学了一点javascript.php,做 ...

  9. PHP面向对象编程学习之对象基础

    php虽然是一门学习起来非常简单的语言,但是这门语言也包含了对面向对象编程的支持.尤其是随着php5的发布,php对面向对象的支持有了很大的进步.最近学习了一下php的面向对象编程,不禁感慨,面向对象 ...

  10. linux部署Web项目总结

    本文用的是CentOS7系统,不是虚拟机. 1.什么是Xshell? xshell连接上linux之后,就等同于linux本身的终端命令窗口. xshell不是必需品,但是它能更好的辅助我们学习lin ...