马上蓝桥了,干货总结基础树论知识点

目录

今日知识点:
对于每个子树如果和小于0就返回0;如果大于0就直接返回。

注意异或的性质,偶消奇不消,所以lca上面的都消掉了,并不需要跑lca,也就是说只需要把根到所有点的距离跑出来即可

如果上传过来小于k个,我们是考虑把当前根节点也加入其中;如果大于k,那就直接返回失败;等于k忽略

这棵树的深度就是这棵树上到根节点的最长距离+1;这棵树的宽度就是到根节点距离相同的节点个数的最大值

最大子树和

思路: 

树上异或

思路: 

树的分解

思路: 

二叉树问题

思路: 


        

        

最大子树和

思路: 

对于每个子树:如果子树和小于0,直接丢掉吧,所以返回0;如果大于0就直接返回。

#include <bits/stdc++.h>
using namespace std;
const int N=2e4;
typedef long long ll; 
vector<int>ve[N];
ll ans,n,a[N],f[N],INF=-1e11;
int dfs(int u,int fa){
	for(int i=0,sz=ve[u].size();i<sz;i++){
		int v=ve[u][i];
		if(v==fa)continue;
		f[u]+=dfs(v,u);
	}
	f[u]+=a[u];
	ans=max(f[u],ans);
	if(f[u]<0)return 0;
	else return f[u];
}
int main(){
	cin>>n;int x,y;ans=INF;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<=n-1;i++){
		cin>>x>>y;
		ve[x].push_back(y);
		ve[y].push_back(x);
	}
	dfs(1,-1);
	cout<<ans;
}

        

        

树上异或

思路: 

注意异或的性质,偶消奇不消,所以lca上面的都消掉了,并不需要跑lca(你喜欢写LCA代码吗?)也就是说只需要把根到所有点的距离跑出来即可

#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int tot,n,m,head[N],f[N];
struct node{int to,w,next;}e[N*2];
void add(int u,int v,int w){e[++tot]={v,w,head[u]};head[u]=tot;}
void dfs(int u,int fa,int num){
	f[u]=num;
	for(int i=head[u];i;i=e[i].next){
		int v=e[i].to,w=e[i].w;
		if(fa==v)continue;
		dfs(v,u,num^w);
	}
}
int main(){
	cin>>n;int u,v,w;
	for(int i=1;i<n;i++){
		scanf("%d%d%d",&u,&v,&w);add(u,v,w);add(v,u,w);	
	}
	dfs(1,0,0);
	cin>>m;
	for(int i=1;i<=m;i++){
		scanf("%d%d",&u,&v);
		printf("%d\n",f[u]^f[v]);	
	}
	return 0;
}

        

        

树的分解

思路: 


此题不好做,首先要明白最终的效果,必然是k个联通的,那么对于每个节点来说,如果孩子匹配不成功,是可以和父亲继续匹配的,也就是上传当前个数即可。

那么对于节点来说:一定是和上传过来的未匹配成功的孩子都保持一个颜色,
否则就联通不了,你可以画图证明。(因为如果匹配成功就可以忽略)

那么如果上传过来小于k个,我们是考虑把当前根节点也加入其中;如果大于k,那就直接返回失败;等于k忽略

#include <bits/stdc++.h>
using namespace std;
int n,k,t,sum;
vector<int>ve[100005];
int dfs(int u,int fa){
	int ans=1;//初始化上传数
	for(int i=0,sz=ve[u].size();i<sz;i++){
		if(ve[u][i]==fa)continue;
		int a=dfs(ve[u][i],u);
		if(a==-1||a>k)return -1;//这段还认识吗,高速公路哦
		else if(a==k)continue;//直接上传0
		ans+=a;//更新上传数
	}
	return ans;
}
int main(){
	cin>>t;
	while(t--){
		cin>>n>>k;int a,b;
		for(int i=0;i<=n;i++)ve[i].clear();
		for(int i=1;i<n;i++){
			cin>>a>>b;
			ve[a].push_back(b);
			ve[b].push_back(a);
		}
		int ans=dfs(1,1);
		if(ans==k)cout<<"YES\n";//包括根节点在内仅上传k个则代表成功分解
		else cout<<"NO\n";
	}
	return 0;
}

        

        

二叉树问题

思路: 

树的深度好说,宽度很容易让人想到树的直径(【算法每日一练]-图论(保姆级教程篇16 树的重心 树的直径)#树的直径 #会议 #医院设置-CSDN博客)感兴趣可以看看啊!

但是!!!这俩玩意不是一个东西哈,直径是直径,宽度是宽度。

现在要求查询这棵树的深度,其实就是这棵树上到根节点的最长距离+1;查询这棵树的宽度,其实就是到根节点距离相同的节点个数的最大值

要处理第3个问题,一个很巧妙的做法是直接就把指向叶子方向的边权设为1,指向根方向的边权设为2。然后最短路即可

#include <bits/stdc++.h>
using namespace std;//拿图
const int N=200;
int n,ans,tot,dis[N],vis[N],head[N],tmp[2000];
struct node{int to,w,next;}e[N*2];
void add(int u,int v,int w){e[++tot]={v,w,head[u]};head[u]=tot;}
void spfa(int s){
	queue<int>q;q.push(s);
	memset(dis,0x3f,sizeof(dis));
	memset(vis,0,sizeof(vis));
	vis[s]=1;dis[s]=0;
	while(!q.empty()){
		int u=q.front();q.pop();vis[u]=0;
		for(int i=head[u];i;i=e[i].next){
			int v=e[i].to,w=e[i].w;
			if(dis[v]>dis[u]+w){
				dis[v]=dis[u]+w;
				if(!vis[v]){vis[v]=1;q.push(v);}
			}
		}
	}
}
int main(){
	cin>>n;int u,v;
	for(int i=1;i<n;i++){//树是n点n-1边
		cin>>u>>v;add(u,v,1);add(v,u,2);
	}
	cin>>u>>v;spfa(1);
	for(int i=1;i<=n;i++)tmp[dis[i]]++,ans=max(ans,dis[i]);
	cout<<ans+1<<'\n';ans=0;
	for(int i=1;i<=2000;i++)ans=max(ans,tmp[i]);
	cout<<ans<<'\n';
	spfa(u);cout<<dis[v]<<'\n';
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/509665.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis如何实现分布式锁,单机Redis与集群Redis问题解决方案

场景1&#xff1a;在单机场景下&#xff0c;可以通过同步锁进行加锁 在单机系统下&#xff0c;该场景是适用的&#xff0c;所有的线程都需要等待同步锁释放 场景2&#xff1a;分布式场景下的分布式锁 场景1中的代码不适用与分布式系统&#xff0c;因为上述的同步锁是JVM层次的…

如何在CentOS安装StackEdit Markdown编辑器并实现无公网IP远程访问使用

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 文章目录 前言1. ubuntu安装VNC2. 设置vnc开机启动3. windows 安…

从零开始构建gRPC的Go服务

介绍 Protocol Buffers and gRPC是用于定义通过网络有效通信的微服务的流行技术。许多公司在Go中构建gRPC微服务&#xff0c;发布了他们开发的框架&#xff0c;本文将从gRPC入门开始&#xff0c;一步一步构建一个gRPC服务。 背景 之前在B站看过一个gRPC教学视频&#xff0c;…

朵米3.5客服系统源码,附带系统搭建教程

朵米客服系统是一款全功能的客户服务解决方案&#xff0c;提供多渠道支持&#xff08;如在线聊天、邮件、电话等&#xff09;&#xff0c;帮助企业建立与客户的实时互动。该系统具有智能分流功能&#xff0c;可以快速将客户请求分配给适当的客服人员&#xff0c;提高工作效率。…

操作系统:浅谈文件系统

目录 1.理解文件系统 1.1.从磁盘开始的抽象存储结构 ​编辑 1.2.操作系统下的文件管理 1.2.1.知识储备 1.2.2.存储文件的属性 1.2.3.存储文件的内容 1.2.4.如何新建文件 1.2.5.如何理解目录 1.2.6.如何找到某一个文件 1.3.操作系统如何打开文件 2.软硬链接 我们知…

外贸技巧:热衷开发却不精于追踪!这个误区害惨了外贸人...

很多外贸业务员热衷于开发客户&#xff0c;可对于后续的追踪却不能给予足够的重视。结果是开发的很辛苦&#xff0c;但后期却屡屡因为跟踪不积极&#xff0c;造成订单机会莫名其妙的就悄悄溜走了。 俗话说的好&#xff0c;一鸟在手胜过二鸟在林&#xff0c;而外贸业务员也需要…

Matlab进阶绘图第48期—带等高线的三维特征渲染散点图

带等高线的三维特征渲染散点图是等高线图与特征渲染三维散点图的组合。 其中&#xff0c;等高线图与特征渲染的三维散点图的颜色用于表示同一个特征。 由于等高线图无遮挡但不直观&#xff0c;特征渲染的三维散点图直观但有遮挡&#xff0c;而将二者组合&#xff0c;可以实现…

风险与收益

风险与收益 影响资产需求的主要因素财富总量预期收益率资产的流动性影响流动性的主要因素 风险 如何降低风险系统风险和非系统风险机会集合与有效集合资产组合理论 影响资产需求的主要因素 影响资产需求的主要因素包括&#xff1a;财富总量、预期收益率、资产的流动性和风险。…

免费SSL证书怎么申请?

在数字化时代&#xff0c;网络安全已成为企业与个人无法忽视的重要议题。其中&#xff0c;SSL&#xff08;Secure Sockets Layer&#xff09;证书作为保障在线信息传输安全的关键工具&#xff0c;已广泛应用于各类网站。更令人欣喜的是&#xff0c;如今市场上存在众多免费SSL证…

DOTS:Burst

目录 一&#xff1a;简介 1.1 Getting started 1.2 C# language support 1.2.1 HPC# overview 1.2.1.1 Exception expressions 1.2.1.2 Foreach and While 1.2.1.3 Unsupported C# features in HPC# 1.2.2 Static read-only fields and static constructor support 1.…

【Linux】查看某个进程的tcp全连接队列长度

TCP三次握手成功后,会把连接放到全连接队列里,等待服务器端accept后移除。 如下图所示,图片转自:https://zhuanlan.zhihu.com/p/547279481 下图转自博客:https://zhuanlan.zhihu.com/p/340016138 TCP三次握手过程中,第一次握手server收到client的syn后,内核会把该连接存…

多功能知识付费源码下载-实现流量互导多渠道变现(带详细安装教程)

资源变现类产品的许多优势&#xff0c;并剔除了那些无关紧要的元素&#xff0c;使得本产品在运营和变现能力方面实现了质的飞跃。多领域素材资源知识变现营销裂变独立版本。 支持&#xff1a;视频、音频、图文、文档、会员、社群、用户发布、创作分成、任务裂变、流量主、在线…

缺陷检测项目 | 基于深度学习的钢管焊缝缺陷检测

项目应用场景 面向钢管焊缝缺陷检测场景&#xff0c;使用深度学习算法来实现&#xff0c;提供钢管焊缝缺陷检测数据集&#xff0c;数据集已经标注整理好&#xff0c;包括 YOLO 和 PASCAL VOC 数据格式&#xff0c;项目检出效果好。 训练数据集展示 项目效果 项目细节 > 具体…

oracle19c安装-aarch64

建议 参考oracle官方文档提供的软硬件要求 https://docs.oracle.com/en/database/oracle/oracle-database/19/ladbi/operating-system-checklist-for-oracle-database-installation-on-linux.html#GUID-E5C0A90E-7750-45D9-A8BC-C7319ED934F0 建议使用OracleLinux8.6及以上操作…

一个页面实现两个滚动条【前端】

一个页面实现两个滚动条【前端】 前言版权推荐一个页面实现两个滚动条最后 前言 2024-4-2 12:54:46 以下内容源自《【前端】》 仅供学习交流使用 版权 禁止其他平台发布时删除以下此话 本文首次发布于CSDN平台 作者是CSDN日星月云 博客主页是https://jsss-1.blog.csdn.net …

TIA博途V17开启仿真后软件卡顿的解决办法

TIA博途V17开启仿真后软件卡顿的解决办法 如下图所示,打开TIA博途V17软件,同时打开任务管理器,监控CPU和内存的使用情况,由于我的内存是32G的,而且没有打开其他的任何软件,所以这里可以暂时不考虑内存的影响, 如下图所示,我们在性能中选中CPU,右键选择“将图形更改为—…

电脑常见故障检测方法与对应问题分析说明

电脑常见故障检测方法与对应问题分析说明 前言说明1、机器无法开机故障2、屏幕无法显示3、无法联网4、能开机但是无法进入系统&#xff0c;提示not boot5、USB接口无法识别U盘 前言说明 本文为小白向&#xff0c;许多内容属于经验学而非科学&#xff0c;还望大佬们轻喷。 如上…

快速入门Linux,Linux岗位有哪些?(一)

文章目录 Linux与Linux运维操作系统&#xff1f;操作系统图解 认识LinuxLinux受欢迎的原因什么是Linux运维Linux运维岗位Linux运维岗位职责Linux运维架构师岗位职责Linux运维职业发展路线计算机硬件分类运维人员的三大核心职责 运维人员工作&#xff08;服务器&#xff09;什么…

网页录制视频技巧大揭秘,让你快速成为录制高手

在信息化快速发展的今天&#xff0c;网页录制视频已经成为一种常见的信息获取、传播和保存方式。无论是在线教育、会议记录还是产品展示&#xff0c;视频录制都能以直观生动的方式传达信息。本文将详细介绍三种常见的网页录制视频方法&#xff0c;通过分步骤详细讲解&#xff0…

键盘输入与屏幕输出——getchar()之深入分析

使用getchar&#xff08;&#xff09;输入字符时的怪象 以回车符 \n 结束字符的输入 输入的字符&#xff08;包括回车符&#xff09;都放在输入缓冲区中 怪象背后的原因 行缓冲&#xff08;Line-buffer&#xff09;输入方式 *将输入字符先放入输入缓冲队列中&#xff0c;再…