BZOJ 2466: [中山市选2009]树 高斯消元
来源:互联网 发布:算法谜题 百度云 编辑:程序博客网 时间:2024/05/21 19:39
Description
图论中的树为一个无环的无向图。给定一棵树,每个节点有一盏指示灯和一个按钮。如果节点的按扭被按了,那么该节点的灯会从熄灭变为点亮(当按之前是熄灭的),或者从点亮到熄灭(当按之前是点亮的)。并且该节点的直接邻居也发生同样的变化。
开始的时候,所有的指示灯都是熄灭的。请编程计算最少要按多少次按钮,才能让所有节点的指示灯变为点亮状态。
Input
输入文件有多组数据。
输入第一行包含一个整数n,表示树的节点数目。每个节点的编号从1到n。
输入接下来的n – 1行,每一行包含两个整数x,y,表示节点x和y之间有一条无向边。
当输入n为0时,表示输入结束。
Output
对于每组数据,输出最少要按多少次按钮,才能让所有节点的指示灯变为点亮状态。每一组数据独占一行。
Sample Input
3
1 2
1 3
0
Sample Output
1
HINT
对于100%的数据,满足1 <= n <=100。
题解
开关灯问题的树上版本,每个灯都只与与他相连的点按的总数的奇偶性有关,那么我们用0表示不按,1表示按,列出n个异或方程,高斯消一下即可,自由元会影响非自由元的取值,所以对于自由元2^n枚举选还是不选,取最小值。
#include<cstdio>#include<cstdlib>#include<cmath>#include<ctime>#include<algorithm>#include<cstring>#include<string>#include<iostream>#include<iomanip>using namespace std;int n;int f[101][101];bool Free[101];int tot=0;void gause(){ for(int i=1;i<=n;i++) { int j; for(j=i;j<=n;j++) if(f[j][i]) break; if(j==n+1) { Free[i]=true; tot++; continue; } for(int k=i;k<=n+1;k++) swap(f[i][k],f[j][k]); for(j=i+1;j<=n;j++) if(f[j][i]) for(int k=i;k<=n+1;k++) f[j][k]^=f[i][k]; }}int ans[101];int get_ans(){ for(int i=n;i>=1;i--) { if(Free[i]) continue; ans[i]=f[i][n+1]; for(int j=i+1;j<=n;j++) if(f[i][j]) ans[i]^=ans[j]; } int re=0; for(int i=1;i<=n;i++) if(ans[i]) re++; return re;}int main(){ while(1) { memset(f,0,sizeof(f)); memset(Free,0,sizeof(Free)); tot=0; scanf("%d",&n); if(n==0) break; for(int i=1;i<n;i++) { int l,r; scanf("%d%d",&l,&r); f[l][r]=1; f[r][l]=1; } for(int i=1;i<=n;i++) f[i][i]=f[i][n+1]=1; gause(); int anss=2147483647; for(int i=0;i<(1<<tot);i++) { int t=i; for(int j=1;j<=n;j++) if(Free[j]) { ans[j]=(t&1); t>>=1; } anss=min(anss,get_ans()); } printf("%d\n",anss); } return 0;}
阅读全文
0 0
- BZOJ 2466: [中山市选2009]树 高斯消元
- BZOJ 2466 中山市选2009 树 高斯消元+暴力
- bzoj 2466: [中山市选2009]树 (高斯消元)
- [BZOJ]2466: [中山市选2009]树 树形DP
- bzoj[中山市选2009]谁能赢呢?
- 较难树形动态规划(bzoj 2466 [中山市选2009]树)
- 【BZOJ】【P2463】【中山市选2009】【题解】【谁能赢呢?】
- 【BZOJ 2463】 [中山市选2009]谁能赢呢?
- bzoj 2463: [中山市选2009]谁能赢呢?
- bzoj 2463: [中山市选2009]谁能赢呢?【博弈】
- BZoj 2463: [中山市选2009]谁能赢呢?【博弈】
- BZOJ 2463: [中山市选2009]谁能赢呢?
- BZOJ 2463 [中山市选2009]谁能赢呢?
- 【bzoj 2463】[中山市选2009]谁能赢呢? 博弈论
- [bzoj]2463 [中山市选2009]谁能赢呢?
- BZOJ 2463 [中山市选2009]谁能赢呢?
- [bzoj-2463][中山市选2009]谁能赢呢? 题解
- bzoj 2465: [中山市选2009]小球 贪心
- WebView使用解析(二)之WebViewClient/WebChromeClient
- Kafka性能测试分析
- 两张二维人物图像互相换脸代码
- Kotlin开发之旅《二》—Kotlin的基本语法
- SQL Server
- BZOJ 2466: [中山市选2009]树 高斯消元
- PHP中的魔术常量、预定义常量和预定义变量
- Python3处理HTTP请求
- 常用排序算法小结
- Excel VBA高效办公应用-第七章-VBA财务报表分析-Part1 (损益表的分析)
- Mybaities一对多注解和xml的实现
- kotlin学习5(字符,字符串,元组)
- 解决Spring MVC 参数乱码问题
- shell入门(二)——面试题实例