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. SaltStack之Job管理和Runner(八)

    SaltStack之Job管理和Runner 配置文件/etc/salt/master cachedir: /var/cache/salt/master # cache路径 keep_jobs: 24 ...

  2. 服务器配置ssl证书支持苹果ATS方法

    服务器配置ssl证书支持苹果ATS方法 发布日期:2016-12-14 苹果安全工程&架构部门主管Ivan Kristic表示ATS将在今年底成为App Sotre app的必要条件,这将大幅 ...

  3. easyui tree获取直接子节点而不获取孙子节点方法

    $(node.target.nextElementSibling).children().each(function(index,ele){ if(checked){ $('#rcDimTreeRow ...

  4. Java数据结构——迭代器

  5. MySQL学习笔记——索引和视图

    索引(index)和管理索引 模式中的一个数据库对象 作用:在数据库中用来加速对表的查询 创建:自动在主键和唯一键上面创建索引 通过使用快速路径访问方法快速定位数据,减少了磁盘的I/O 与表独立存放, ...

  6. asp.net+mysq 数据库操作类

    对数据库操作的使用方法: 1.引入命名空间 2.操作.三四行代码即可完成数据操作.类似于: using System; using System.Data; using System.Text; us ...

  7. CentOS6.x安装配置nginx

    nginx安装 nginx的官网:http://nginx.org/   相应下载页面:http://nginx.org/en/download.html   我这里使用nginx的yum在线安装 w ...

  8. DrawCall

    [精]draw call 理解和优化 http://bubuko.com/infodetail-387899.html DrawCall 优化 . http://www.cnblogs.com/sof ...

  9. python 常见排序实例

    使用Python 基础排序算法设计,冒泡排序,插入排序,快速排序... 需求 对一组无序数据进行排序算法设计,要求如下: 输入:[1, 3, 5, 23, 75, 34, 456, 86, 22, 7 ...

  10. SaltStack安装篇

    一.基础介绍1.简介 salt 是一个基础平台管理工具 salt是一个配置管理系统,能够维护预定于状态的远程节点 salt是一个分布式远程执行系统,用来在远程节点上执行命令和查询数据 2.salt的核 ...