【图论】树论

经典例子如下:

lca

树上差分

树的重心

树的直径

树的中心

树链剖分

最近公共祖先

P3379 【模板】最近公共祖先(LCA) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

简单模板,过了无数遍

P3128 [USACO15DEC] Max Flow P - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

树上差分

就差一点

#include<iostream>
using namespace std;
int  n,k;
int dep[50001];
int fa[50001][21];
int a[50001];
int b[50001];struct EDGE{int next;
int to;}edge[100001];
int head[50001];
int tot=0;
void addedge(int u,int v){
edge[++tot].next=head[u];
edge[tot].to=v;
head[u]=tot;
}
void dfs(int u,int father){dep[u]=dep[father]+1;
for(int i=1;(1<<i)<=dep[u];i++){fa[u][i]=fa[fa[u][i-1]][i-1];
}for(int i=head[u];~i;i=edge[i].next){int v=edge[i].to;if(v==father)continue;fa[v][0]=u;dfs(v,u);
}}void dfss(int u,int father){cout<<"现在u,fa"<<u<<" "
//a[u]=子树a+差分ba[u]=b[u];for(int i=head[u];~i;i=edge[i].next){int v=edge[i].to;cout<<"现在v"<<v<<endl;if(v==father)continue;dfs(v,u);a[u]+=a[v];for(int i=1;i<=n;i++){cout<<a[i]<<" ";}cout<<endl;
}}int  lca(int x,int y){if(dep[x]<dep[y])swap(x,y);for(int i=20;i>=0;i--){if(dep[fa[x][i]]>=dep[y])x=fa[x][i];if(x==y)return x;
}for(int i=20;i>=0;i--){if(fa[x][i]!=fa[y][i]){x=fa[x][i];y=fa[y][i];}
}return fa[x][0];}int main(){
cin>>n>>k;
for(int i=1;i<=n;i++)head[i]=-1;for(int i=1;i<=n-1;i++){int u,v;cin>>u>>v;addedge(u,v);addedge(v,u);
}dfs(1,0);while(k--){
int x,y;
cin>>x>>y;
int mf=lca(x,y);b[x]++;
b[y]++;
b[mf]--;
if(mf != 1) b[fa[mf][0]]--;}cout<<"现在检验5的边";
for(int i=head[5];~i;i=edge[i].next)
{
cout<<edge[i].to<<" ";}
cout<<"检验结束"<<endl;dfss(1,0);
int ans=0;for(int i=1;i<=n;i++){ans=max(ans,a[i]);
}cout<<ans;}

P5002 专心OI - 找祖先 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

n^3 tle

树的直径

树的直径两种求法_求树的直径-CSDN博客

法一:dfs找距离任意一点最远的点u

dfs找距离u最远的一点v

uv即为直径

只能用于没有付权边

void dfs(int u,int father){for(int i=head[u];~i;i=edge[i].next){
int v=edge[i].to;
if(v==father)continue;d[v]=d[u]+edge[i].w;
dfs(v,u);
}}int main(){
dfs(1,0);
//选出d[s]最大
dfs(s,0);
//选出d[v]最大
cout<<d[v];}

法二:

某一点的最短路和次短路

某一点到其子节点的最长距离和次长距离,加起来就是直径

void dfsdp(int u,int father)
{for(int i=head[u];~i;i=edge[i].next){int v=edge[i].to;int w=edge[i].w;if(v==father)continue;dfsdp(v,u);if(d1[u]<d1[v]+w){d2[u]=d1[u];d1[u]=d1[v]+w;}else if(d2[u]<d1[v]+w){
d2[u]=d1[v]+w;}
}}

Cow Marathon - OpenJ_Bailian 1985 - Virtual Judge (vjudge.net.cn)

#include<iostream>
using namespace std;
int n,m;struct EDGE{
int next;
int to;
int w;}edge[80001];
int head[40001];
int d[40001];
int tot=0;
void addedge(int u,int v,int w){
edge[++tot].next=head[u];
edge[tot].to=v;
edge[tot].w=w;
head[u]=tot;
}void dfs(int u,int father){for(int i=head[u];~i;i=edge[i].next){int v=edge[i].to;if(v==father)continue;d[v]=d[u]+edge[i].w;dfs(v,u);
}}int main(){cin>>n>>m;
for(int i=1;i<=n;i++)head[i]=-1;
for(int i=1;i<=m;i++){int u,v,w;char s;cin>>u>>v>>w>>s;addedge(u,v,w);addedge(v,u,w);
}dfs(1,0);
int xuan1=-1;int xuan2=0;
for(int i=1;i<=n;i++){if(d[i]>xuan2){xuan1=i;xuan2=d[i];}d[i]=0;}dfs(xuan1,0);
xuan1=-1;xuan2=0;for(int i=1;i<=n;i++){if(d[i]>xuan2){xuan1=i;xuan2=d[i];}}
cout<<xuan2;}

树的中心

树的重心是节点数

树的重心是路径长度

到别的点的最长距离最小的点

-》枚举每个点

、子树的最长距离直径中有板子   +、向上走的


//走下面的最长
void dfsd12(int u,int father){
for(int i=head[u];~i;i=edge[i].next){int v=edge[i].to;int w=edge[i].w;if(v==father)continue;dfsd12(v,u);if(d1[u]<d1[v]+w){d2[u]=d1[u];d1[u]=d1[v]+w;p1[u]=v;//path}else if(d2[u]<d1[v]+w){d2[u]=d1[v]+w;}
}
}//走上面的最长
void dfsup(int u,int father){
for(int i=head[u];~i;i=edge[i].next){int v=edge[i].to;int w=edge[i].w;if(v==father)continue;if(p1[u]==v){up[v]=max(d2[u],up[u])+w;}else {up[v]=max(d1[u],up[u])+w;}dfsup(v,u);
}}

1073. 树的中心 - AcWing题库


//走下面的最长
void dfsd12(int u,int father){
for(int i=head[u];~i;i=edge[i].next){int v=edge[i].to;int w=edge[i].w;if(v==father)continue;dfsd12(v,u);if(d1[u]<d1[v]+w){d2[u]=d1[u];d1[u]=d1[v]+w;p1[u]=v;//path}else if(d2[u]<d1[v]+w){d2[u]=d1[v]+w;}
}
}//走上面的最长
void dfsup(int u,int father){
for(int i=head[u];~i;i=edge[i].next){int v=edge[i].to;int w=edge[i].w;if(v==father)continue;if(p1[u]==v){up[v]=max(d2[u],up[u])+w;}else {up[v]=max(d1[u],up[u])+w;}dfsup(v,u);
}}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32-I2C

本内容基于江协科技STM32视频学习之后整理而得。 文章目录 1. I2C通信1.1 I2C通信简介1.2 硬件电路1.3 I2C时序基本单元1.3.1 起始条件和终止条件1.3.2 发送一个字节1.3.3 接收一个字节1.3.4 发送应答和接收应答 1.4 I2C时序1.4.1 指定地址写1.4.2 当前地址读1.4.3 指定地址读…

Python实战训练(方程与拟合曲线)

1.方程 求e^x-派&#xff08;3.14&#xff09;的解 用二分法来求解&#xff0c;先简单算出解所在的区间&#xff0c;然后用迭代法求逼近解&#xff0c;一般不能得到精准的解&#xff0c;所以设置一个能满足自己进度的标准来判断解是否满足 这里打印出解x0是因为在递归过程中…

什么是PPG(光电容积描记)传感器?

PPG&#xff08;光电容积描记&#xff09;传感器是一种用于测量血液容量变化的设备。PPG传感器利用光学技术&#xff0c;通过检测皮肤下血液的反射光量变化来获取心率、血氧饱和度和其他生理参数。以下是PPG传感器的工作原理和应用&#xff1a;

python语句性能分析

1、for语句性能优于while import timeif __name__ __main__:start_time time.time()for i in range(10 ** 8):passend_time time.time()run_time end_time - start_timeprint(run_time)i 0start_time time.time()while i < 10 ** 8:i 1end_time time.time()run_tim…

强化学习的数学原理:时序差分算法

概述 之前第五次课时学习的 蒙特卡洛 的方法是全课程当中第一次介绍的第一种 model-free 的方法&#xff0c;而本次课的 Temporal-Difference Learning 简称 TD learning &#xff08;时序差分算法&#xff09;就是第二种 model-free 的方法。而对于 蒙特卡洛方法其是一种 non…

IntelliJ IDEA 同时多行同时编辑操作快捷键

首先 点击要编辑的地方,长按鼠标左键不放,同时按住 Ctrl Shift Alt,然后就可以进行多行编辑了

Android项目中,查看项目依赖树的多种方式

1.使用预设的Task来进行查看 1.1 命令行 查看某个模块的所有依赖树&#xff1a; gradlew [模块名称]:dependencies 例如&#xff1a;gradlew app:dependencies查看某个模块的某功能的依赖树&#xff1a; gradlew [模块名称]:dependencies --configuration [功能名称] 例如&…

k8s学习之cobra命令库学习

1.前言 打开k8s代码的时候&#xff0c;我发现基本上那几个核心服务都是使用cobra库作为命令行处理的能力。因此&#xff0c;为了对代码之后的代码学习的有比较深入的理解&#xff0c;因此先基于这个库写个demo&#xff0c;加深对这个库的一些理解吧 2.cobra库的基本简介 Git…

前端JS特效第22波:jQuery滑动手风琴内容切换特效

jQuery滑动手风琴内容切换特效&#xff0c;先来看看效果&#xff1a; 部分核心的代码如下&#xff1a; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xm…

linux RTC时钟时间出现了明显的偏移

RTC时钟时间出现了明显的偏移 1、开发环境2、问题阐述3、验证问题3.1、首先去排查了硬件电路和芯片电压不稳定的问题。3.2、晶振的问题。3.3、芯片本身3.4、芯片寄存器 4、代码修改 1、开发环境 平台&#xff1a;imx6ul kernel版本&#xff1a;linux4.1.5 RTC芯片&#xff1a;…

机械键盘有哪些分类

机械键盘是一种比传统的薄膜键盘更耐用、更快捷、更具有手感的键盘。它的键帽和按键是独立的&#xff0c;能够提供更好的反应速度和操作感。机械键盘在现代化生活中得到了广泛的应用。根据其特性和使用场景&#xff0c;机械键盘可以分为以下几类&#xff1a; 1.轴体分类 机械…

设计模式探索:建造者模式

1. 什么是建造者模式 建造者模式 (Builder Pattern)&#xff0c;也被称为生成器模式&#xff0c;是一种创建型设计模式。 定义&#xff1a;将一个复杂对象的构建与表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 建造者模式要解决的问题&#xff1a; 建造者模…

誉天教育7月开班计划:为梦想插上腾飞的翅膀!

随着夏日的脚步渐近&#xff0c;誉天教育也迎来了新一轮的学习热潮。在这个充满活力和希望的季节里&#xff0c;我们精心策划了7月的开班计划&#xff0c;旨在为广大学子提供一个优质、高效的学习平台&#xff0c;助力他们追逐梦想&#xff0c;实现自我价值。 本月 Linux云计算…

探讨3D沉浸式在线会议系统的研发 - Meta演示的元宇宙虚拟化身多人对话场景,Web端现在也可以实现了 !

要实现一个元宇宙多人会议系统&#xff0c;关键技术有&#xff1a; 1. 3D虚拟空间的构建&#xff08;含光影特效、虚拟现实和增强现实&#xff09; 2. 3D虚拟化身的构建&#xff08;含动画、表情、语音&#xff09; 3. 多人角色管理 4. 会话控制和信息同步 5. 语音合成 6…

目标检测2--yolov1中相关基础知识(边框回归、交并比、nms)介绍

文章目录 前言回归介绍基本概念线性回归非线性回归边框回归 交并比介绍定义程序实现 NMS介绍定义与原理工作原理代码实现 前言 在上篇博客目标检测1–Pytorch目标检测之yolov1中介绍了yolov1的原理&#xff0c;里面提到几个知识点现在详细介绍一下。 回归介绍 在上篇博客中提…

【Qt】Qt开发环境搭建

目录 一. Qt SDK的下载&安装 二. Qt相关工具介绍 Qt的常用开发工具有&#xff1a; Qt CreatorVisual StudioEclipse 一. Qt SDK的下载&安装 Qt 下载官网&#xff1a; http://download.qt.io/archive/qt/ 国内清华源: https://mirrors.tuna.tsinghua.edu.cn/qt/arc…

实战某大型连锁企业域渗透

点击星标&#xff0c;即时接收最新推文 本文选自《内网安全攻防&#xff1a;红队之路》 扫描二维码五折购书 实战域渗透测试流程 对黑客来说&#xff0c;拿下域控制器是终极目标。然而攻击者空间是如何通过采取信息收集、权限提升、横向移动等一系列手段&#xff0c;从而一步步…

《基于 defineProperty 实现前端运行时变量检测》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; 近期刚转战 CSDN&#xff0c;会严格把控文章质量&#xff0c;绝不滥竽充数&#xff0c;欢迎多多交流~ &am…

STM32CubeMX实现4X5矩阵按键(HAL库实现)

为了实现计算器键盘&#xff0c;需要使用4X5矩阵按键&#xff0c;因此&#xff0c;我在4X4矩阵键盘上重新设计了一个4X5矩阵按键。原理图如下&#xff1a; 原理描述&#xff1a; 4X5矩阵按键&#xff0c;可以设置4个引脚为输出&#xff0c;5个引脚为输入模式&#xff0c;4个引…

【云原生】Prometheus监控Docker指标并接入Grafana

目录 一、前言 二、docker监控概述 2.1 docker常用监控指标 2.2 docker常用监控工具 三、CAdvisor概述 3.1 CAdvisor是什么 3.2 CAdvisor功能特点 3.3 CAdvisor使用场景 四、CAdvisor对接Prometheus与Grafana 4.1 环境准备 4.2 docker部署CAdvisor 4.2.2 docker部署…