1、题目大意:给你一棵树,树的每个节点都有一个权值,是0或1,最开始都是0,你可以做一种修改操作,就是把一个节点和它相邻的
节点的权值取反,问最少几次修改能把所有节点的权值变得都是1,最多100个节点

2、分析:经典高斯消元问题,如果i节点的修改能够影响到j节点,那么a[i][j] = 1;(a是系数矩阵)

等式的右边是1。。。对于所有的自由元2^n暴力枚举,然后就AC了, 这题坑了一个礼拜啊,(大神们不要嘲笑我T_T)

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
int a[110][110], is_free[110], p[110], ans[110], end_ans, m, tot;
inline void gauss_elimination(int n){
    for(int i = 1, j = 1; i <= n; i ++, j ++){
        if(j == n + 1){
            m = i - 1;
            return;
        }
        for(int k = i; k <= n; k ++){
            if(a[k][j]){
                for(int h = 1; h <= n + 1; h ++)
                    swap(a[i][h], a[k][h]);
                break;
            }
        }
        if(!a[i][j]){
            is_free[j] = 1;
            tot ++;
            i --;
            continue;
        }
        for(int k = i + 1; k <= n; k ++){
            if(a[k][j]){
                for(int h = j; h <= n + 1; h ++){
                    a[k][h] ^= a[i][h];
                }
            }
        }
    }
    m = n;
    return;
}
int main(){
    int n;
    while(scanf("%d", &n) != EOF){
        if(n == 0) return 0;
        memset(a, 0, sizeof(a));
        memset(is_free, 0, sizeof(is_free));
        memset(ans, 0, sizeof(ans));
        tot = 0;
        end_ans = 2147483647;
        for(int i = 1; i < n; i ++){
            int u, v;
            scanf("%d%d", &u, &v);
            a[u][v] = a[v][u] = 1;
        }
        for(int i = 1; i <= n; i ++) a[i][i] = a[i][n + 1] = 1;
        gauss_elimination(n);
        for(int i = 0; i < (1 << tot); i ++){
            for(int j = 0; j < tot; j ++){
                if(i & (1 << j)) p[j + 1] = 1;
                else p[j + 1] = 0;
            }
            int u = 0;
            for(int j = 1; j <= n; j ++){
                if(is_free[j]){
                    u ++;
                    ans[j] = p[u];
                }
            }
            for(int k = n, j = m; j >= 1; j --){
                for( ; k && is_free[k]; k --);
                ans[k] = a[j][n + 1];
                for(int h = k + 1; h <= n; h ++){
                    if(a[j][h])
                        ans[k] ^= ans[h];
                }
                k --;
            }
            int cnt = 0;
            for(int j = 1; j <= n; j ++) if(ans[j])
                cnt ++;
            end_ans = min(end_ans, cnt);
        }
        printf("%d\n", end_ans);
    }
    return 0;
}

BZOJ2466——[中山市选]树的更多相关文章

  1. [bzoj2466][中山市选2009]树_树形dp

    树  bzoj-2466 中山市选-2009 题目大意:给定一棵树,每一个点有一个按钮和一个灯泡.如果按下一个点的按钮那么和这个点直接相连的点包括这个点的灯泡的状态会改变.如果是点亮就会变成熄灭,如果 ...

  2. bzoj2466: [中山市选2009]树

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

  3. 【dfs】【高斯消元】【异或方程组】bzoj1770 [Usaco2009 Nov]lights 燈 / bzoj2466 [中山市选2009]树

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

  4. 【BZOJ2466】[中山市选2009]树 树形DP

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

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

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

  6. BZOJ 2467: [中山市选2010]生成树 [组合计数]

    2467: [中山市选2010]生成树 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 638  Solved: 453[Submit][Status][ ...

  7. BZOJ_2467_[中山市选2010]生成树_数学

    BZOJ_2467_[中山市选2010]生成树_数学 [Submit][Status][Discuss] Description 有一种图形叫做五角形圈.一个五角形圈的中心有1个由n个顶点和n条边组成 ...

  8. bzoj 2441 [中山市选2011]小W的问题

    bzoj 2441 [中山市选2011]小W的问题 Description 有一天,小W找了一个笛卡尔坐标系,并在上面选取了N个整点.他发现通过这些整点能够画出很多个"W"出来.具 ...

  9. BZOJ 2440: [中山市选2011]完全平方数 [容斥原理 莫比乌斯函数]

    2440: [中山市选2011]完全平方数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3028  Solved: 1460[Submit][Sta ...

随机推荐

  1. IBatis学习

    (1)建立 SqlMap.config文件 <?xml version="1.0" encoding="utf-8" ?> <sqlMapCo ...

  2. WinForm------GridControl控件中使用SearchLookUpEdit控件的方法

    1.在数据库添加两张表,拥有主外键关系 主键表: 外键表: 2.往工具栏里拖出GridCont控件,并增加相应的列,这里对"省份"进行修改,"FileName" ...

  3. haproxy安装

    最近一直在整理之前用过的东西,现在到haproxy了,安装如下: tar xf haproxy-1.4.27.tar.gz cd haproxy-1.4.27 make TARGET=linux26 ...

  4. CodeLite的姿势

    在Mac上安装cscope 1.下载cscope的Zip压缩包 2.解压 3.打开终端,进入解压目录,运行 ./configure make make install 4.在CodeLite中,在Pl ...

  5. Robot Framework--07 变量的声明、赋值及其使用

    转自:http://blog.csdn.net/tulituqi/article/details/7984642 一.变量的声明 1.变量标识符 每个变量都可以用  变量标识符{变量名}    来进行 ...

  6. redis删除list中指定index的值

    Redis的List删除命令: lrem : lrem mylist 0 "value"    //从mylist中删除全部等值value的元素   0为全部,负值为从尾部开始. ...

  7. Python基础之【第二篇】

    一.作用域 对作用域来说,只要变量在内存里面存在就可以使用: ==: name = 'saneri' print name 二.三元运算 result = 值1 if 条件 else 值2 如果条件为 ...

  8. C-基本语法与运算

    编译: Technorati 标记: C 1, 编译compilers 命令make 将高级语言转换为低级语言. clang: 1,预处理(preprocessing) 2,编译(complition ...

  9. 参数化查询为什么能够防止SQL注入

    原文地址: http://www.cnblogs.com/LoveJenny/archive/2013/01/15/2860553.html http://zhangxugg-163-com.itey ...

  10. 在CentOS上搭建apache和PHP服务器环境(转)

    1.您也可以使用一键自动部署环境的工具,请参见网友开发的这个工具 http://www.centos.bz/2013/08/ezhttp-tutorial/ 2. 安装: wget -c http:/ ...