【题意】给定一棵树的灯,按一次x改变与x距离<=1的点的状态,求全0到全1的最少次数。n<=100。

【算法】高斯消元解异或方程组

【题解】设f[i]=0/1表示是否按第i个点的按钮,根据每个灯的亮灭可以列出n个方程:a[i][j]表示第i盏灯是否受开关j影响,a[i][n+1]=a[i][i]=1。

由于方案不唯一,所以有自由元,DFS所有自由元得到所有可能答案,比较得到最少次数。DFS记得加最优性剪枝。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=;
bool a[maxn][maxn],A[maxn];
int n,ans;
void gauss(){
for(int i=;i<=n;i++){
int r=i;
for(int j=i;j<=n;j++)if(a[j][i]){r=j;break;}
if(!a[r][i])continue;
if(r!=i)for(int j=i;j<=n+;j++)swap(a[i][j],a[r][j]);
for(int j=i+;j<=n;j++)if(a[j][i]){
for(int k=n+;k>=i;k--){
a[j][k]^=a[i][k];
}
}
}
}
void dfs(int x,int now){
if(now>=ans)return;
if(!x){ans=now;return;}
if(a[x][x]){
A[x]=a[x][n+];
for(int j=x+;j<=n;j++)A[x]^=a[x][j]*A[j];
dfs(x-,now+A[x]);
}
else{
A[x]=;dfs(x-,now);
A[x]=;dfs(x-,now+);
}
} int main(){
scanf("%d",&n);
while(n){
memset(a,,sizeof(a));
for(int i=;i<n;i++){
int u,v;
scanf("%d%d",&u,&v);
a[u][v]=a[v][u]=;
}
for(int i=;i<=n;i++)a[i][i]=a[i][n+]=;
gauss();
ans=0x3f3f3f3f;
dfs(n,);
printf("%d\n",ans);
scanf("%d",&n);
}
return ;
}

最新文章

  1. Linux下使用crontab定时备份日志
  2. 跟着百度学PHP[6]超级全局变量
  3. MVC3 新建项目
  4. notes:spm多重比较校正
  5. Powershell的远程管理
  6. C# csv 操作类
  7. .net 后台中对html标签按钮跳转后台以及后台简单验证
  8. nginx 详解
  9. Builder 生成器模式
  10. QSslError 类
  11. angularjs中的绑定策略“@”,“=”,“&amp;”实例
  12. phpcms列表页内容如何替换?
  13. C#封装程序集属性方法注释说明
  14. 机器学习基石:02 Learning to Answer Yes/No
  15. 监控mysql主从同步
  16. Light OJ 1058
  17. [转] HTML5 Blob与ArrayBuffer、TypeArray和字符串String之间转换
  18. JAVA生成六位随机数
  19. tinyxml2使用
  20. ReactNative踩坑日志——使用async/await语法解决网络请求的异步导致的指令执行顺序错乱问题

热门文章

  1. lintcode-407-加一
  2. Spring+Netty4实现的简单通信框架
  3. (打补丁 )patch
  4. POI操作Excel异常Cannot get a text value from a numeric cell
  5. node进程捕捉错误
  6. 第190天:js---String常用属性和方法(最全)
  7. 第187天:js基础---常见的Bom对象
  8. 洛谷P1345 [USACO5.4]奶牛的电信(最小割)
  9. Remember the Word UVALive - 3942(dp+trie)
  10. Android性能优化:布局优化 详细解析(含&lt;include&gt;、&lt;ViewStub&gt;、&lt;merge&gt;讲解 )