题目

宫水三叶有一棵树,这是一棵大小为 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. R语言as.name函数(转化为命名的类别对象)和is.name函数(检验是否是命名的类别对象)实战
  2. Lexus Extroic OpenCart 2.X 自适应主题模板 ABC-0648-03
  3. Python 非线性方程组
  4. ACM练习 小Z来讲排名规则(WA)【C++ stable_sort稳定排序】
  5. git cherry-pick 复制其他分支内容到当前分支
  6. 【flink】Flink 1.12.2 源码浅析 : yarn-per-job模式解析 从脚本到主类
  7. 的input最大长度_LeetCode 84 | 单调栈解决最大矩形问题
  8. Android中自定义水球
  9. 防备电脑死机故障技巧的8个方法
  10. imkey只支持imtoken吗_辛巴表态我只认天道 不认散打!等天道回来我还他1000万关注!散打哥喊话辛巴 不要说只认道不认散打哥!...
  11. 那些让程序员炸毛的奇葩需求,说起来满满的都是泪!
  12. 织梦错误mynews.lib.php on line 40,织梦错误Fatal error: Using $this when not in object context...
  13. 华硕afudos刷bios_华硕M2N-MX SE PLUS主板 如何用afudos命令刷BIOS
  14. 陈玉琴老师的中医理学
  15. pythonrestapicctv_Python Web服务(15) 持续更新
  16. Mixed supervision for surface-defect detection: from weakly to fully supervised learning:表面缺陷检测的混合监督
  17. Convex optimization 1 --- convex set
  18. SpringBoot(四)整合视图
  19. 流体机械原理及设计07
  20. 【微服务】VirtualBox + Vagrant 快速配置虚拟机

热门文章

  1. SDC时序约束(1)- create_clock
  2. 数组的排序、常用方法
  3. 新闻集团高群耀:移动APP统治下一个十年
  4. F.凛冬将至(带权LCA)
  5. 我的创作纪念日,成为创作者的第256天!
  6. [2018-10-1]斐讯K2 PSG1218 A2 刷bread 和第三方老毛子Padavan固件
  7. 编程小白的计算机毕业设计指导开发教程-JSP+Servlet实现注册登陆功能
  8. 使用 multiparty 模块进行文件上传
  9. Qt源码剖析-智能指针
  10. 测试组来了个00后卷王,老油条感叹是真干不过,但是.....