可能算是道中规中矩的套路题吧……

Time limit : 2sec / Memory limit : 256MB

Problem Statement

You are given a tree with N vertices. The vertices are numbered 0 through N−1, and the edges are numbered 1 through N−1. Edge i connects Vertex xi and yi, and has a value ai. You can perform the following operation any number of times:

  • Choose a simple path and a non-negative integer x, then for each edge e that belongs to the path, change ae by executing ae←ae⊕x (⊕ denotes XOR).

Your objective is to have ae=0 for all edges e. Find the minimum number of operations required to achieve it.

Constraints

  • 2≤N≤105
  • 0≤xi,yi≤N−1
  • 0≤ai≤15
  • The given graph is a tree.
  • All input values are integers.

题目大意

给定一个 $n$ 个节点的树,节点的标号为 $0\sim n-1$,边的标号为 $1\sim n-1$。每条边 $i$ 连接节点 $x_i$ 和 $y_i$,并且有一个权值 $a_i$。你可以进行如下的操作若干次。

  • 选择一条简单路径以及一个非负整数 $x$,然后对于每条属于这条路径的边,将它的权值异或上 $x$。

你的目标是让所有边的权值变成 $0$,同时,最小化操作的次数。


题目分析

我的初步想法是考虑对路径权值按位拆分。可能是受以前做过的一道序列一维问题的影响吧,就一直朝着这个思路想下去了……这个思路的关键在于没法处理不同位的路径的合并。

考虑设计一个守恒的部分量:将每个点记点权为相连所有路径边权的异或和。这么处理的好处在于对路径(u,v)进行一次操作之后,全图只有u,v的点权改变。对于点权相同的点对,最优操作当然是直接将它们消去;于是最后剩下的点权最多只有16种。注意到点权0是没有影响的,所以处理完点权之后,再对剩下的15种点权做一遍状压dp就可以了。

//CXR的快读板子怎么这么快

 #include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 100000
#define P 15
#define INF 1e9
#define Gmin(x,y) (x>(y)&&(x=(y)))
const int maxn = ;
const int maxs = <<; int n,cnt,a[maxn],f[maxs],sta,ans; class Class_FIO
{
private:
#define FS 100000
#define tc() (A==B&&(B=(A=FI)+fread(FI,1,FS,stdin),A==B)?EOF:*A++)
#define pc(c) (putchar(c))
#define tn(x) (x<<3)+(x<<1)
#define D isdigit(c=tc())
int T;char c,*A,*B,FI[FS],S[FS];
public:
I Class_FIO() {A=B=FI;}
Tp I void read(Ty& x) {x=;W(!D);W(x=tn(x)+(c&),D);}
Tp I void write(Ty x) {W(S[++T]=x%+,x/=);W(T) pc(S[T--]);}
Ts I void read(Ty& x,Ar&... y) {read(x),read(y...);}
}F;
int dp(int x)
{
if (!x) return ;
if (f[x]!=-) return f[x];
int ret = 1e9;
for (int i=; i<; i++)
if (x&(<<i)) for (int j=; j<; j++)
if ((x&(<<j))&&i!=j)
ret = std::min(ret, dp(x^(<<i)^(<<j)^(<<(i^j)))++((x&(<<(i^j)))?:));
f[x] = ret;
return ret;
}
int main()
{
F.read(n);
memset(f, -, sizeof f);
for (int i=; i<n; i++)
{
int x,y,z;
F.read(x), ++x, F.read(y), ++y, F.read(z);
a[x] ^= z, a[y] ^= z;
}
for (int i=; i<=n; i++)
if (a[i]&&((sta>>a[i])&)) sta ^= <<a[i], ++ans;
else if (a[i]) sta ^= <<a[i];
printf("%d\n",ans+dp(sta));
return ;
}

END

【思维题 状压dp】APC001F - XOR Tree的更多相关文章

  1. 【bzoj2734】集合选数(有点思维的状压dp)

    题目传送门:bzoj2734 这题一个月前看的时候没什么头绪.现在一看,其实超简单. 我们对于每个在$ [1,n] $范围内的,没有因数2和3的数$ d $,将它的倍数$ 2^a 3^b d $一起处 ...

  2. P3694 邦邦的大合唱站队/签到题(状压dp)

    P3694 邦邦的大合唱站队/签到题 题目背景 BanG Dream!里的所有偶像乐队要一起大合唱,不过在排队上出了一些问题. 题目描述 N个偶像排成一列,他们来自M个不同的乐队.每个团队至少有一个偶 ...

  3. 6.28 NOI模拟赛 好题 状压dp 随机化

    算是一道比较新颖的题目 尽管好像是两年前的省选模拟赛题目.. 对于20%的分数 可以进行爆搜,对于另外20%的数据 因为k很小所以考虑上状压dp. 观察最后答案是一个连通块 从而可以发现这个连通块必然 ...

  4. “景驰科技杯”2018年华南理工大学程序设计竞赛 A. 欧洲爆破(思维+期望+状压DP)

    题目链接:https://www.nowcoder.com/acm/contest/94/A 题意:在一个二维平面上有 n 个炸弹,每个炸弹有一个坐标和爆炸半径,引爆它之后在其半径范围内的炸弹也会爆炸 ...

  5. [多校联考2019(Round 5 T1)] [ATCoder3912]Xor Tree(状压dp)

    [多校联考2019(Round 5)] [ATCoder3912]Xor Tree(状压dp) 题面 给出一棵n个点的树,每条边有边权v,每次操作选中两个点,将这两个点之间的路径上的边权全部异或某个值 ...

  6. BZOJ 2734 洛谷 3226 [HNOI2012]集合选数【状压DP】【思维题】

    [题解] 思维题,看了别人的博客才会写. 写出这样的矩阵: 1,3,9,... 2,6,18,... 4,12.36,... 8,24,72,... 我们要做的就是从矩阵中选出一些数字,但是不能选相邻 ...

  7. 7月15日考试 题解(链表+状压DP+思维题)

    前言:蒟蒻太弱了,全打的暴力QAQ. --------------------- T1 小Z的求和 题目大意:求$\sum\limits_{i=1}^n \sum\limits_{j=i}^n kth ...

  8. 刷题向》关于第一篇状压DP BZOJ1087 (EASY+)

    这是本蒟蒻做的第一篇状压DP,有纪念意义. 这道题题目对状压DP十分友善,算是一道模板题. 分析题目,我们发现可以用0和1代表每一个格子的国王情况, 题目所说国王不能相邻放置,那么首先对于每一行是否合 ...

  9. 【bzoj1087】【互不侵犯King】状压dp裸题(浅尝ACM-D)

    [pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=54329606 向大(hei)佬(e)势力学(di ...

随机推荐

  1. C 语言实例 - 循环输出26个字母

    C 语言实例 - 循环输出26个字母 循环输出 个字母. 实例 #include <stdio.h> int main() { char c; for(c = 'A'; c <= ' ...

  2. mac 增加/usr/bin目录的操作无权限

    起因:想要往/usr/bin目录下拷贝文件,提示: operation not permitted 解决办法: 1. 重启,启动中长安command+r进入恢复模式 2.顶部菜单拉中打开终端 3. 输 ...

  3. Codeforces 1152D(dp)

    要点 寻找最多边的匹配的结论:贪心地从叶子开始找,最后答案都是奇数层下边的那条边. 设\(dp[i][j]\)表示当前长度为\(i\),平衡度为\(j\),平衡度为(数量减去)数量. 增加左右括号转移 ...

  4. NET Core2

    NET Core的介绍   .NET Core 是一个通用开发平台,它由微软和开源社区共同管理(git hub的.NET开源社区): 他支持Windows,macOS和Linux,并且可以运行在硬件设 ...

  5. input文本框默认提示

    今天闲暇时间把自己以前写的一个文本框默认提示函数改成了一个小插件.下面是代码 1.引入jQuery库 <script src="http://code.jquery.com/jquer ...

  6. (转)磁盘阵列RAID原理、种类及性能优缺点对比

    磁盘阵列RAID原理.种类及性能优缺点对比 原文:http://www.cnblogs.com/chuncn/p/6008173.html 磁盘阵列(Redundant Arrays of Indep ...

  7. 六,IO系统

    六,IO系统 一,数据源 1,数据源--管道确认使用那根管道--节点流 2,先确定管道在tey中new出管道,new出后就写关闭代码,写完关闭代码在写中间代码 3,取数据和放数据结束语句必须有两个,不 ...

  8. java命令--jstack 工具

    一.介绍 jstack是java虚拟机自带的一种堆栈跟踪工具.jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项&qu ...

  9. Uncaught Error: Bootstrap's JavaScript requires jQuery

    在写bootstarp的时候,一直报 Uncaught Error: Bootstrap's JavaScript requires jQuery 查看了自己引入的文件路径是对的,也可以使用jquer ...

  10. SQLServer 2012 报表服务部署配置(2)

    2.当系统打开"SQL Server安装中心",则说明我们可以开始正常的安装SQL Server 2012,可以通过"计划"."安装".&q ...