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. python BeautifulSoup4

    source form  http://www.bkjia.com/ASPjc/908009.html 昨天把传说中的BeautifulSoup4装上了,还没有装好的童鞋,请看本人的上一篇博客: Py ...

  2. JDBC编程的方式

    JDBC编程的方式,我们以一个简单的查询为例,使用JDBC编程,如下: 从上面可以看出JDBC编程一般要如下步骤: 1. 加载数据库驱动 2. 创建并获取数据库连接 3. 创建jdbc stateme ...

  3. iOS qrcode 默认尺寸与修改

    四种容错格式的尺寸:27.31.31.35. // 5.将CIImage转换成UIImage,并放大显示 UIImage *imagex = [UIImage imageWithCIImage:out ...

  4. SVM松弛变量-记录毕业论文3

    上一篇博客讨论了高维映射和核函数,也通过例子说明了将特征向量映射到高维空间中可以使其线性可分.然而,很多情况下的高维映射并不能保证线性可分,这时就可以通过加入松弛变量放松约束条件.同样这次的记录仍然通 ...

  5. System.currentTimeMillis()计算方式与时间的单位转换

    目录[-] 一.时间的单位转换 二.System.currentTimeMillis()计算方式 一.时间的单位转换 1秒=1000毫秒(ms) 1毫秒=1/1,000秒(s)1秒=1,000,000 ...

  6. Android学习笔记——ListView

    该工程的功能是实现在一个activity中显示一个列表 以下代码是MainActivity.java中的代码 package com.example.listview; import java.uti ...

  7. MAFFT多重序列比对--(附比对彩标方法)

    [转记]MAFFT多重序列比对图解教程 [絮语] 一提到多重序列比对,很多人禁不住就想到ClustalW(Clustalx为ClustalW的GUI版),其实有一款多重序列比对软件-MAFFT,不论从 ...

  8. Visual Studio Code 怎么支持中文

    这其实是编码问题 和字体什么的没有关系,在VSCode中默认是用UTF-8编码方式打开文件,只要你的文件是这个编码就能正常打开如果不是,不进行设置VSCode是不会自动切换编码方式打开 手动可以Reo ...

  9. org.apache.http.client.HttpClient; HttpClient 4.3超时设置

    可用的code import org.apache.commons.lang.StringUtils;import org.apache.http.HttpEntity;import org.apac ...

  10. Python之路【第七篇续】:进程、线程、协程

    Socket Server模块 SocketServer内部使用 IO多路复用 以及 “多线程” 和 “多进程” ,从而实现并发处理多个客户端请求的Socket服务端.即:每个客户端请求连接到服务器时 ...