DTOJ#5019. 一棵树
题目
宫水三叶有一棵树,这是一棵大小为 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. 一棵树相关推荐
- 用父节点表示法表示一棵树
今天学习,把书上的代码自己边对照,边敲了一下. package mytree;import java.util.ArrayList; import java.util.List;/*** 用父节点表示 ...
- 14.相同的树另一棵树的子树检查子树二叉树中的列表(教你们使用相同的套路快速解决这四道题)
一.相同的树 这道题是开胃菜的开始,使用递归进行解决 递归三部曲: 确定递归函数的参数和返回值 因为我们要比较的是两棵树是否相等,所以参数分别是两棵树的根节点,返回值为boolean类型,即两棵树是否 ...
- c语言孩子兄弟法存储一棵树,数据结构(C语言版)---树
1.树:n个结点的有限集,n=0时为空树. 1)特点: (1)有且仅有一个特定的称为根的结点. (2)有若干个互不相交的子树,这些子树本身也是一棵树. (3)树的根结点没有前驱结点,除根结点外的所有结 ...
- 怎样推断一棵树是否是平衡二叉树
推断的思路非常easy.若一棵树是平衡二叉树,它的左右子树都是平衡二叉树,而且左右子树的高度差小于等于1.注意.实现的时候,推断左右子树的平衡性时.能够顺便计算子树高度,不用再另外计算一次.以下是其递 ...
- 用 vue + d3 画一棵树
结果预览 github pages vue 和 d3 的角色 画图可分为两步: 元素坐标计算 数据绑定 坐标计算只需要一些 api,本文使用 d3. 数据绑定既可以借助 d3,也可以使用 vue.d3 ...
- 软路试--就像一棵树活着
余先生说:我们中的每一个,它应该成长就像一棵树.即使是现在,我们什么都不是,但就我希望你有树的种子,即使你是对土壤的一个中间步骤.您还可以吸收土壤中的养分,他们的成长起来.后,遥远的地方,人们就能看到 ...
- 一棵树的生成树有几颗_次小生成树(树剖,生成树)
生成树的概念: 在一个无向图中,设顶点数为\(n\),取其中\(n-1\)条边并使所有点相连,所得到的一棵树即为生成树. 最小生成树: 如果还没有接触过生成树的同学,欢迎戳->最小生成树详解 次 ...
- 一棵树,怎么就平衡了(图解AVL+实现)
什么是AVL树 大家好,我是bigsai,好久不见,甚是想念. 对于树这种数据结构,想必大家也已经不再陌生,我们简单回顾一下. 在树的种类中,通常分成二叉树和多叉树,我们熟悉的二叉树种类有二叉搜索(排 ...
- LeetCode——Same Tree(判断两棵树是否相同)
问题: Given two binary trees, write a function to check if they are equal or not. Two binary trees are ...
最新文章
- R语言as.name函数(转化为命名的类别对象)和is.name函数(检验是否是命名的类别对象)实战
- Lexus Extroic OpenCart 2.X 自适应主题模板 ABC-0648-03
- Python 非线性方程组
- ACM练习 小Z来讲排名规则(WA)【C++ stable_sort稳定排序】
- git cherry-pick 复制其他分支内容到当前分支
- 【flink】Flink 1.12.2 源码浅析 : yarn-per-job模式解析 从脚本到主类
- 的input最大长度_LeetCode 84 | 单调栈解决最大矩形问题
- Android中自定义水球
- 防备电脑死机故障技巧的8个方法
- imkey只支持imtoken吗_辛巴表态我只认天道 不认散打!等天道回来我还他1000万关注!散打哥喊话辛巴 不要说只认道不认散打哥!...
- 那些让程序员炸毛的奇葩需求,说起来满满的都是泪!
- 织梦错误mynews.lib.php on line 40,织梦错误Fatal error: Using $this when not in object context...
- 华硕afudos刷bios_华硕M2N-MX SE PLUS主板 如何用afudos命令刷BIOS
- 陈玉琴老师的中医理学
- pythonrestapicctv_Python Web服务(15) 持续更新
- Mixed supervision for surface-defect detection: from weakly to fully supervised learning:表面缺陷检测的混合监督
- Convex optimization 1 --- convex set
- SpringBoot(四)整合视图
- 流体机械原理及设计07
- 【微服务】VirtualBox + Vagrant 快速配置虚拟机
热门文章
- SDC时序约束(1)- create_clock
- 数组的排序、常用方法
- 新闻集团高群耀:移动APP统治下一个十年
- F.凛冬将至(带权LCA)
- 我的创作纪念日,成为创作者的第256天!
- [2018-10-1]斐讯K2 PSG1218 A2 刷bread 和第三方老毛子Padavan固件
- 编程小白的计算机毕业设计指导开发教程-JSP+Servlet实现注册登陆功能
- 使用 multiparty 模块进行文件上传
- Qt源码剖析-智能指针
- 测试组来了个00后卷王,老油条感叹是真干不过,但是.....