Graph & Tree
图论学习笔记
TYQ图论真是个渣渣呢
所以TYQ决定猛补图论
好的从0x60开始
表示博客园不用Latex真的烦呢QAQ,公式难打的要命QAQ
0x60~0x62
最短路讲解跳过
最小生成树:
- Kruskal:
挺容易的,贪心的选最大值就好了
时间复杂度emmmO(mlogm),适用于稀疏图
- Prim
首先只在最小生成树中加入root节点
设两个集合S(剩余点),T(生成树)
每次找到两个点,使得他们的连线最短
时间复杂度O(n2),多用于稠密图
0x63~0x64
众所周知树是一种特殊的图,所以我们这里采用链式前向星存边
树的直径:
- 树形Dp:
- demo:
void dp(int x){
v[x] = true ;
for(int i=head[x]; i;i = Next[i]){
int y = ver[i];
if(v[y])continue ;
dp(y);
ans = max(ans,d[x]+d[y]+edge[i]) ;
d[x] = max(d[x],d[y]+edge[i])
}
}
//本代码同算法竞赛进阶指南书中代码- 两次Dfs/Bfs
- 从任意一个节点出发找到离他最远的点p
- 从p出发找到离他最远的点q
- 那么p到q为树的一条直径
- demo
void dfs0(int step,int x){
d[x] = step ;
v[x] = true ;
for(int i=head[x]; i;i = Next[i]){
if(!v[i])
dfs0(step+,i) ;
}
if(maxd<step){
maxd = step;
p = x ;
}
}
void dfs1(int step,int x){
d[x] = step ;
v[x] = true ;
for(int i=head[x]; i;i = Next[i]){
if(!v[i])
dfs1(step+,i) ;
}
if(maxd<step){
maxxd = step;
q = x ;
}
}
LCA
找出x与y的最近公共祖先
- 暴力
- 从x节点向上跳,标记所有跳过的节点
- 再从y向上跳,遇到已标记的节点则停止
- 期望时间复杂度O(logN),实际上珂以卡成O(N)
- 树上倍增法
- 设F[x,k]表示x的2k辈祖先,若不存在则为0
- 我们执行一次广/深度优先遍历以求出F数组
- 然后就可以O(logN)回答询问了
- tarjan算法
- 本质上是优化倍增法
- 离线算法,需要一次性读入全部询问
- 在tarjan算法执行的任意时刻,树上的节点分为三类:
- 已经访问完毕并且回溯的节点,标记值为2
- 已经开始递归,但尚未回溯的节点,标记值为1
- 其他节点,标记值为0
- 对于正在访问的节点x,他到根节点的路径已经标记为1
- 若y是已访问完的节点,则LCA(x,y)就是从y走到根节点的路程中第一个标记为1的节点
- 优化:当一个节点获得2的标记的时候,合并它所在的集合与它的父节点所在的集合
- 那么每次查询就可以直接使用getfa(y)了
- 时间复杂度为O(N+M),不会证
- ST表:
- dfs一遍,得到特殊的长度为 2*n-1 dfs序,然后维护一个在dfs序上的区间深度最小值,而拥有这个最小深度值的节点就是我们要求的LCA。
- 使用ST表预处理珂以O(1)回答询问
- 时间复杂度O(NlogN),且是在线算法
- 树链剖分:
树剖求LCA的速度还很快,O(N)预处理,O(logN)查询,相较于倍增LCA更快,而且求LCA那部分更好写,但是dfs部分比较难写.
树剖求LCA可能相较于倍增最大的优势是空间复杂度较低,只要O(N)
整个算法流程就是先树剖O(N)然后一个判断u与v是否在同一条重链,不在就往上跳,最后得到LCA,在就可直接得到LCA
- 至于为什么查询是O(logN)的,因为重链只有 logN 条,所以是O(logN)的
- 就是常数大点QAQ
树上差分
- 例题
- 我们定义一条附加边(x,y)覆盖的边为主要边构成的树中,x,y之间路径上的边
- 那么若第一步切断覆盖了0次的主要边,则可任意斩断一条附加边
- 若第一步切断覆盖了1次的主要边,则第二部方法唯一
- 若斩断覆盖了两次及两次以上的主要边则无解
- 那么问题就转化为给定一个无向图和一颗生成树,求每条主要边被附加边覆盖的次数
- 那么我们把一条附加边(x,y)覆盖改为把数上x,y两个节点点权加一,LCA(x,y)点权减一
- 最后进行遍历,求出F[x]代表以x为根的子树的节点点权之和
- 那么F[x]就是x与其父亲之间连边被覆盖的次数
基环树
- 树加上一条边
- 构成的环叫做基环
- 跟树差不多,但要先dfs找环,先考虑子树,再考虑环
- 可能以后会替代树?毕竟都在考仙人掌了
- JZOJ考过
接下来我要换Markdown了QAQ
引用:算法竞赛进阶指南
Warning!
本文由 TYQ 创作,采用 知识共享署名 4.0 国际许可协议进行许可。
转载要与作者联系,并需在正文明显处署名作者且注明文章出处。
对了,我永远喜欢C++啊。
Graph & Tree的更多相关文章
- CACTI命令行添加DEVICE/GRAPH/TREE
有时要加入大量的机器到 Cacti ,直接修改 Cacti 还是很复杂的.所以最好还是通过他本身提供的工具来实现. Cacti 早就为我们想到过这个问题了.这些工具就在 cacti/cli 目 ...
- hdu4044 GeoDefense
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4044 题意:一个树上的塔防游戏.给你n个结点的树,你要在树结点上建塔防御,在第 i 个结点上有 ki ...
- cacti监控windows服务器
参考文献: 通过Cacti监控windows资源 前提条件 一.已安装好Cacti:ubuntu下cacti安装配置 二.准备好以下安装文件: Cacti_SNMP_ ...
- (原创)monitor Dell Powerconnec 6224 with cacti
使用cacti监控DELL Powerconnect 6224,可以直接使用http://docs.cacti.net/usertemplate:host:dell:powerconnect:62xx ...
- 《算法》第四章部分程序 part 2
▶ 书中第四章部分程序,加上自己补充的代码,随机生成各类无向图 ● 随机生成无向图 package package01; import edu.princeton.cs.algs4.StdOut; i ...
- github 排名前100的项目
dotnet/roslyn The .NET Compiler Platform ("Roslyn") provides open-source C# and Visual Bas ...
- igraph Tutorial
igraph Tutorial¶ 参考http://www.cs.rhul.ac.uk/home/tamas/development/igraph/tutorial/tutorial.html ...
- How to install cacti on centos 6
Cacti – Network and performance monitoring tool Cacti is one of best monitoring tool used to monit ...
- PatentTips - Sprite Graphics Rendering System
BACKGROUND This disclosure relates generally to the field of computer graphics. More particularly, b ...
随机推荐
- ELK 安装Elasticsearch
章节 ELK 介绍 ELK 安装Elasticsearch ELK 安装Kibana ELK 安装Beat ELK 安装Logstash ELK栈要安装以下开源组件: Elasticsearch Ki ...
- Bulma CSS - 简介
Bulma CSS框架教程 Bulma CSS – 简介 Bulma CSS – 开始 Bulma CSS – CSS类 Bulma CSS – 模块化 Bulma CSS – 响应式 Bulma是什 ...
- python EasyUI + Django--整合 CSRF 防护去除
先来张完整图: 关于Django 得CSRF 中间件 防护 GET 是不做CSRF验证得 但POST 默认验证 $.cookie('csrftoken')) "v ...
- Windows2008R2安装iis和iis下搭建web服务器(9.18 第七天)
IIS internet information services 互联网信息服务微软开发的运行在windows中的互联网服务,提供了web.ftp.smtp服务 Windows server 200 ...
- EF Core的安装及入门
一.环境准备 1.开发环境:.NET Core 3.1 2.IDE工具:Visual Studio 2019 3.数据库:SQL Server 2012 二.EF Core的安装 1.新建一个项目,如 ...
- UVALive 4043 转化最佳完美匹配
首先黑点和白点是组成一个二分图这毫无疑问 关键是题目中要求的所有黑白配的线不能交叉...一开始我也没想到这个怎么转化为二分图里面的算法. 后来看书才知道,如果两两交叉,则可以把两根线当四边形的对角线, ...
- React16 新特性
一.使用Error Boundary处理错误组件 React16之前:组件在运行期出错,会阻塞整个应用的渲染. React16之后:引入新的错误处理机制——Error Bounda ...
- Ubuntu 16.04 上安装 CUDA 9.0 详细教程
https://blog.csdn.net/QLULIBIN/article/details/78714596 前言: 本篇文章是基于安装CUDA 9.0的经验写,CUDA9.0目前支持Ubuntu1 ...
- Java 跨系统开发隐患(一)
换行符 主流系统换行符如下: Windows : \r\n Linux : \n Unix : \r 为了保证代码可以跨系统开发或使用,建议使用换行符时用下列语句获取: System.getPrope ...
- 18 12 24 html 表单学习
html表单 表单用于搜集不同类型的用户输入,表单由不同类型的标签组成,相关标签及属性用法如下: 1.<form>标签 定义整体的表单区域 action属性 定义表单数据提交地址 meth ...