Edge Weight Assignment(树*异或*贪心)
时间:2020-04-27
本文章向大家介绍Edge Weight Assignment(树*异或*贪心),主要包括Edge Weight Assignment(树*异或*贪心)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
大意:
给定一棵无根树,要求你任意设置n-1条边的边权.
使得任意叶子节点间边权的XOR值为0; |
\(\color{Red}{--------------------我是华丽的分割线(●ˇ∀ˇ●)-----------------------}\)
\(看上去很难吧??\)做起来也很难
\(\color{Red}{Ⅰ.考虑最小}\)
\(那请你先想个简单的问题,考虑两个叶子节点f最小值的情况。很容易想到我在路上全挂满1对吧?\)
\(但问题来了,如果两个叶子间的距离为奇数,就行不通了。这时候最小值怎么算呢?\)
\(全放1肯定不行,少放1个1也不行,这样要抵消成0的话还是要放1.\)
\(\color{Purple}{那就少放两个1,让这连个数异或后可以抵消掉1,这样并不难}\)
\(\color{Red}{Ⅱ.考虑最大}\)
\(这个似乎就很难了。但是一开始肯定希望把路上放满不同的数,这样肯定可以异或成0.\)
\(为什么?回想一下异或的性质,我是不是可以这样放权值\)
\(0000001,0000010,0000100,0001000......突然到最后,放一个11111111和前面全部抵消\)
\(完美!!这样我们的答案就是 n-1 !! 不过用脚想也知道没这么简单。什么时候不满足呢?\)
\(当叶子节点距离只有2的时候无法满足,2是XOR的特殊情况,想为0就必须放两个相同的。\)
#include <bits/stdc++.h>
using namespace std;
const int maxn=2e5+5;
struct p{
int to,nxt;
}d[maxn];int n,head[maxn],cnt=1;
void add(int u,int v){
d[cnt].nxt=head[u],d[cnt].to=v,head[u]=cnt++;
}
int indug[maxn],deep[maxn],ji,ou,father[maxn];
void dfs(int u,int fa)
{
deep[u]=deep[fa]+1;
if(indug[u]==1)
{
if(deep[u]%2) ji=1;
else ou=1;
father[fa]++;
return;
}
for(int i=head[u];i;i=d[i].nxt)
if(d[i].to!=fa) dfs(d[i].to,u);
}
int main()
{
cin>>n;
for(int i=1;i<n;i++)
{
int l,r;
cin>>l>>r;
add(l,r);add(r,l);
indug[l]++,indug[r]++;
}
int root;
for(int i=1;i<=n;i++)
if(indug[i]!=1) root=i;//随便找一个不是叶子的节点为根
dfs(root,root);
if(ji&&ou) cout<<3<<" ";
else cout<<1<<" ";
int ans=n-1;
for(int i=1;i<=n;i++)
if(father[i]) ans=ans-father[i]+1;
cout<<ans;
}
原文地址:https://www.cnblogs.com/iss-ue/p/12789533.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- asp dotnet core 提供大文件下载的测试
- R语言模拟人类生活预期寿命动态可视化动画图gif
- Python遍历字典
- R语言随机森林模型中具有相关特征的变量重要性
- WPF 使用 Direct Manipulation 的方法
- R语言分析负利率下金融市场:负利率和年金价值的变化
- python字典-增、删、改
- C# dotnet 使用判断文件夹存在的方法判断一个文件路径会怎样
- 怎样给wordpress网站模板,添加最新文章、随机文章、热评文章?
- [医疗信息化][DICOM教程]1.使用Java的DICOM基础-理解DICOM文件-DICOM Basics using Java - Making Sense of the DICOM File
- python自动播放网课
- Istio实战——流量管理
- WordPress移除head头部js、css、feed等多余加载项
- python控制鼠标键盘,解放你的双手~
- 用腾讯云批量计算(batch-compute)调度GPU分布式机器学习