【题目链接】 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;
}

转载于:https://www.cnblogs.com/forever97/p/bzoj2466.html

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

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

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

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

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

  3. bzoj 2464: 中山市选[2009]小明的游戏(BFS)

    2464: 中山市选[2009]小明的游戏 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 963  Solved: 394 [Submit][Sta ...

  4. [BZOJ 3143][Hnoi2013]游走(高斯消元+期望)

    Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点, ...

  5. bzoj 3143: [Hnoi2013]游走(高斯消元)

    3143: [Hnoi2013]游走 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 3171  Solved: 1390 [Submit][Stat ...

  6. BZOJ.4820.[SDOI2017]硬币游戏(思路 高斯消元 哈希/AC自动机/KMP)

    BZOJ 洛谷 建出AC自动机,每个点向两个儿子连边,可以得到一张有向图.参照 [SDOI2012]走迷宫 可以得到一个\(Tarjan\)+高斯消元的\(O((nm)^3)\)的做法.(理论有\(6 ...

  7. BZOJ 2337: [HNOI2011]XOR和路径( 高斯消元 )

    一位一位考虑异或结果, f(x)表示x->n异或值为1的概率, 列出式子然后高斯消元就行了 --------------------------------------------------- ...

  8. BZOJ 2707: [SDOI2012]走迷宫( tarjan + 高斯消元 )

    数据范围太大不能直接高斯消元, tarjan缩点然后按拓扑逆序对每个强连通分量高斯消元就可以了. E(u) = 1 + Σ E(v) / degree(u) 对拍时发现网上2个程序的INF判断和我不一 ...

  9. bzoj 3503: [Cqoi2014]和谐矩阵(高斯消元)

    3503: [Cqoi2014]和谐矩阵 Time Limit: 10 Sec  Memory Limit: 128 MBSec  Special Judge Submit: 1101  Solved ...

最新文章

  1. jsoncpp的读写操作
  2. leetcode485. 最大连续1的个数 *py:“又是一行就解决了,没意思”
  3. web.xml 基本配置
  4. docker gpu 创建 训练环境_巧用 Docker 快速部署 GPU 环境
  5. mysql1423_MySQL++简介 | 学步园
  6. vb.net 读写cookie
  7. 别再问我exe反编译成Python脚本了!
  8. 0805封装尺寸/0402封装尺寸/0603封装尺寸/1206封装尺寸
  9. 微信小程序(1)--注册及下载IDE
  10. 获取微信视频号视频地址
  11. 拓嘉辰丰:哪些会影响拼多多推广效果
  12. 【Django】admin的save_modle方法重写-20220803
  13. Good Numbers 暴力/进制
  14. 用WORD批量制作工作证件
  15. 模块电路选型(1)----电源模块
  16. el-table滚动条被挡住的问题
  17. JST-BLE-DLQ蓝牙模组在物联网通信领域的应用
  18. git-crypt 在 windows中解密过程步骤
  19. sip 时序图_时序图学习(一)
  20. Yarn01:诞生背景、架构和工作机制介绍

热门文章

  1. Unity3D之NGUI基础6.1:按钮交互
  2. bzoj 3407: [Usaco2009 Oct]Bessie's Weight Problem 贝茜的体重问题(DP)
  3. 单纯型法Ⅱ(bzoj 1061: [Noi2008]志愿者招募)
  4. bzoj 1901: Zju2112 Dynamic Rankings(离线树状数组+主席树)
  5. 51nod-1065:最小正子段和
  6. python测试系列教程——python+Selenium+chrome自动化测试框架
  7. cesium 经纬度绘制点_Cesium经纬度与坐标的问题
  8. Ubuntu 14 如何解压 .zip、.rar 文件
  9. 深入理解PHP之foreach
  10. Elasticsearch 日期时间处理