题目

宫水三叶有一棵树,这是一棵大小为 n n n 的树,点从 0 0 0 开始编号。

树有 n − 1 n-1 n−1 条边,每条边可以用三个数 ( x i , y i , w i ) (x_i,y_i,w_i) (xi​,yi​,wi​) 来描述,表示连接了 x i , y i x_i,y_i xi​,yi​ 的权值为 w i w_i wi​ 的边。

宫水三叶想要改造这棵树。她可以做以下两种操作:

  • 加入一条边 ( x , y , w ) (x,y,w) (x,y,w) 。图中可以已经出现连接 ( x , y ) (x,y) (x,y) 的边,即允许有重边。但是三叶需要保证加完边后的图任意一个环的边的异或和都为 0 0 0 。
  • 删除图中的一条边。但是三叶需要保证删除完的图联通。

特别注意的是,对于一个 n n n 个点 n − 1 n-1 n−1 条边的连通图是不存在环的,这样一定满足所有环的异或值都为 0 0 0 的限制。

三叶可以重复进行操作,她想知道她最后改造出来的图的边权和最小是多少。

数据范围

本题采用捆绑测试。

对于所有数据,满足 2 ≤ n ≤ 1 0 5 , 0 ≤ x i , y i < n , x i ≠ y i , 0 ≤ w i < 2 30 2\le n \le 10^5,0\le x_i,y_i < n,x_i\neq y_i,0\le w_i <2^{30} 2≤n≤105,0≤xi​,yi​<n,xi​​=yi​,0≤wi​<230。

子任务编号 n n n w i w_i wi​ 分值
1 1 1 ≤ 500 \le 500 ≤500 < 2 30 <2^{30} <230 20 20 20
2 2 2 ≤ 5000 \le 5000 ≤5000 < 2 30 <2^{30} <230 25 25 25
3 3 3 ≤ 1 0 5 \le 10^5 ≤105 < 2 12 <2^{12} <212 25 25 25
4 4 4 ≤ 1 0 5 \le 10^5 ≤105 < 2 30 <2^{30} <230 30 30 30

题解

考虑把 ( i , j ) (i,j) (i,j)连起来,其代价为 ( i , j ) (i,j) (i,j)在树上之间路径的权值和,所以我们可以在把他建成完成图(不需要真的建),然后在上面跑最小生成树即可。
至于跑最小生成树这一块,我们将其放进01trie树里贪心即可,深度越深的异或和一定越小。

代码

#include<iostream>
#include<vector>
using namespace std;
vector<int> X;
int n,tot,cnt,root,head[100010],to[200010],w[200010],nxt[200010],ch[2000010][2];
void adde(int u,int v,int W)
{nxt[++tot]=head[u],to[tot]=v,w[tot]=W,head[u]=tot;
}
void dfs(int x,int fa)
{for(int i=head[x];i;i=nxt[i]) if(to[i]!=fa) X[to[i]-1]=X[x-1]^w[i],dfs(to[i],x);
}
void addt(int &p,int x,int w)
{if(!p) p=++cnt,ch[p][0]=ch[p][1]=0;if(w<0) return;addt(ch[p][(x>>w)&1],x,w-1);
}
long long ask(int p,int x,int w)
{if(w<0) return 0;if(ch[p][(x>>w)&1]) return ask(ch[p][(x>>w)&1],x,w-1);return ask(ch[p][!((x>>w)&1)],x,w-1)+(1ll<<w);
}
long long js(vector<int> X,int w)
{if(w<0||X.empty()) return 0;vector<int> _1,_0;_1.clear(),_0.clear();for(int i=0,nq=X.size();i<nq;i++)if((X[i]>>w)&1) _1.push_back(X[i]);else _0.push_back(X[i]);long long ans=0;if(_1.size()&&_0.size()){root=cnt=0,ans=(1<<30);for(int i=0,n1=_1.size();i<n1;i++) addt(root,_1[i],30);for(int i=0,n2=_0.size();i<n2;i++) ans=min(ans,ask(root,_0[i],30));}return ans+js(_1,w-1)+js(_0,w-1);
}
int main()
{cin>>n;for(int i=1,u,v,w;i<n;i++) cin>>u>>v>>w,adde(u+1,v+1,w),adde(v+1,u+1,w),X.push_back(0);X.push_back(0),dfs(1,0),cout<<js(X,30);
}

DTOJ#5019. 一棵树相关推荐

  1. 用父节点表示法表示一棵树

    今天学习,把书上的代码自己边对照,边敲了一下. package mytree;import java.util.ArrayList; import java.util.List;/*** 用父节点表示 ...

  2. 14.相同的树另一棵树的子树检查子树二叉树中的列表(教你们使用相同的套路快速解决这四道题)

    一.相同的树 这道题是开胃菜的开始,使用递归进行解决 递归三部曲: 确定递归函数的参数和返回值 因为我们要比较的是两棵树是否相等,所以参数分别是两棵树的根节点,返回值为boolean类型,即两棵树是否 ...

  3. c语言孩子兄弟法存储一棵树,数据结构(C语言版)---树

    1.树:n个结点的有限集,n=0时为空树. 1)特点: (1)有且仅有一个特定的称为根的结点. (2)有若干个互不相交的子树,这些子树本身也是一棵树. (3)树的根结点没有前驱结点,除根结点外的所有结 ...

  4. 怎样推断一棵树是否是平衡二叉树

    推断的思路非常easy.若一棵树是平衡二叉树,它的左右子树都是平衡二叉树,而且左右子树的高度差小于等于1.注意.实现的时候,推断左右子树的平衡性时.能够顺便计算子树高度,不用再另外计算一次.以下是其递 ...

  5. 用 vue + d3 画一棵树

    结果预览 github pages vue 和 d3 的角色 画图可分为两步: 元素坐标计算 数据绑定 坐标计算只需要一些 api,本文使用 d3. 数据绑定既可以借助 d3,也可以使用 vue.d3 ...

  6. 软路试--就像一棵树活着

    余先生说:我们中的每一个,它应该成长就像一棵树.即使是现在,我们什么都不是,但就我希望你有树的种子,即使你是对土壤的一个中间步骤.您还可以吸收土壤中的养分,他们的成长起来.后,遥远的地方,人们就能看到 ...

  7. 一棵树的生成树有几颗_次小生成树(树剖,生成树)

    生成树的概念: 在一个无向图中,设顶点数为\(n\),取其中\(n-1\)条边并使所有点相连,所得到的一棵树即为生成树. 最小生成树: 如果还没有接触过生成树的同学,欢迎戳->最小生成树详解 次 ...

  8. 一棵树,怎么就平衡了(图解AVL+实现)

    什么是AVL树 大家好,我是bigsai,好久不见,甚是想念. 对于树这种数据结构,想必大家也已经不再陌生,我们简单回顾一下. 在树的种类中,通常分成二叉树和多叉树,我们熟悉的二叉树种类有二叉搜索(排 ...

  9. LeetCode——Same Tree(判断两棵树是否相同)

    问题: Given two binary trees, write a function to check if they are equal or not. Two binary trees are ...

最新文章

  1. acwing算法题--多重背包问题一
  2. 使用 FOR XML PATH 合并SQL Server查询结果的重复行
  3. [SUCTF2018]babyre [ACTF新生赛2020]fungame
  4. 由于采用分时技术 用户可以独占计算机资源,计算机操作系统第1章练习题
  5. android ringtone获取uri,android – 如何通过文件路径从MediaStore获取Uri?
  6. python3 socketserver_《Python核心编程(第3版)》——2.5 *SocketServer模块
  7. 真正掌握vuex的使用方法(一)
  8. win7修改路径【桌面路径,administrator的路径】
  9. 配置网络测试环境的批处理
  10. 蓝桥杯2015年第六届C/C++B组省赛第八题-移动距离
  11. ACR122U-A9|ACR1251|ACM1252系列NFC读写器读卡器PCSC Tool测试工具使用步骤说明
  12. 最强分布式锁工具:Redisson
  13. 计算机维修管理平台软件,美萍电脑行业管理软件(电脑业务管理系统、电脑维修管理系统、组装业务、电脑装机管理软件)--管理软件,美萍是专家!...
  14. MinGW编译windows可以调试的ffmpeg4.4
  15. BeagleBone Black 从零到一 (2 MLO、U-Boot)_spl
  16. 计算机内存运算太低,内存频率低对电脑性能有影响吗
  17. MarkDown CheatSheet 速查表
  18. change在python是什么函数_python函数基础
  19. mysql 慢查询优化_MySQL 性能优化之慢查询
  20. 北斗三号频点_北斗第三代RNSS多频点接收模块的制造方法

热门文章

  1. Tak and Cards(dp 背包)
  2. 常用操作系统扫描工具介绍
  3. 网络部第二次升华培训
  4. Mac 干净彻底地卸载 MySQL
  5. Typecho主题开发---(index.php)
  6. python中if嵌套语句_讲解Python中if语句的嵌套用法
  7. 微信小程序canvas绘图 绘图完成保存图片 附带代码和效果图
  8. 使用cookie获取用户上次访问时间
  9. java sqlserver 异常处理_Java代码SSL https 加密连接 sqlserver
  10. Java算法——翻转二叉树(LeetCode第226题)