图论学习笔记


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算法执行的任意时刻,树上的节点分为三类:
  1. 已经访问完毕并且回溯的节点,标记值为2
  2. 已经开始递归,但尚未回溯的节点,标记值为1
  3. 其他节点,标记值为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

Link

引用:算法竞赛进阶指南

Warning!

本文由 TYQ 创作,采用 知识共享署名 4.0 国际许可协议进行许可。
转载要与作者联系,并需在正文明显处署名作者且注明文章出处。
对了,我永远喜欢C++啊。

Graph & Tree的更多相关文章

  1. CACTI命令行添加DEVICE/GRAPH/TREE

    有时要加入大量的机器到 Cacti ,直接修改 Cacti  还是很复杂的.所以最好还是通过他本身提供的工具来实现. Cacti  早就为我们想到过这个问题了.这些工具就在   cacti/cli 目 ...

  2. hdu4044 GeoDefense

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4044 题意:一个树上的塔防游戏.给你n个结点的树,你要在树结点上建塔防御,在第 i 个结点上有 ki ...

  3. cacti监控windows服务器

    参考文献: 通​过​C​a​c​t​i​监​控​w​i​n​d​o​w​s​资​源 前提条件 一.已安装好Cacti:ubuntu下cacti安装配置 二.准备好以下安装文件: Cacti_SNMP_ ...

  4. (原创)monitor Dell Powerconnec 6224 with cacti

    使用cacti监控DELL Powerconnect 6224,可以直接使用http://docs.cacti.net/usertemplate:host:dell:powerconnect:62xx ...

  5. 《算法》第四章部分程序 part 2

    ▶ 书中第四章部分程序,加上自己补充的代码,随机生成各类无向图 ● 随机生成无向图 package package01; import edu.princeton.cs.algs4.StdOut; i ...

  6. github 排名前100的项目

    dotnet/roslyn The .NET Compiler Platform ("Roslyn") provides open-source C# and Visual Bas ...

  7. igraph Tutorial

      igraph Tutorial¶   参考http://www.cs.rhul.ac.uk/home/tamas/development/igraph/tutorial/tutorial.html ...

  8. How to install cacti on centos 6

    Cacti – Network and performance monitoring tool   Cacti is one of best monitoring tool used to monit ...

  9. PatentTips - Sprite Graphics Rendering System

    BACKGROUND This disclosure relates generally to the field of computer graphics. More particularly, b ...

随机推荐

  1. 算法实战(六)Z 字形变换

    一.前言 之前因为第五题最长回文字符串需要使用到dp解法,所以我花了很长的时间来研究dp(因为每天又要上班,加上这段时间事情比较多,所以花了三个星期才搞定),好不容易算入了个门,有兴趣的同学可以看看我 ...

  2. FTP故障排除

    1,ping 检查 IP是否通 禁PING可以使用TCPING 2,服务器端被动模式设置,可设置固定端口号,保证防火墙上该端口畅通 浏览器默认是主动模式 3,使用FLASHFXP软件可以监测到数据端口 ...

  3. H5页面跳转到小程序代码

    1.H5页面加代码直接打开小程序 <script type="text/javascript src="https://res.wx.qq.com/open/js/jweix ...

  4. 【LeetCode】解数独

    做题之前先复习下[STL中的Tuple容器] 我们知道,在Python中,大家都知道tuple这个概念,是一个只读的元素容器,容器内的元素数据类型可以不同,而在CPP中大部分的容器只能储存相同数据类型 ...

  5. 深入X64架构(翻译)

    | 本人只是原创翻译,而且翻译也不一定好,纯当锻炼.内容如果英文好的同学,建议直接去看英文原版,比较爽. NBAOL系列2代产品是 windows平台64位的应用程序,在技术测试过程中,遇到一些cra ...

  6. Python学习:安装配置pycharm编辑器

    我只介绍windows的安装过程,因为mac的安装过程实在是过于简单了,一路继续就可以了. 1. windows安装过程 1.1 下载安装包,软件可以找我领取 ! ​ 根据自己的操作系统进行下载,左侧 ...

  7. 欧拉回路--P2731 骑马修栅栏 Riding the Fences

    实在懒得复制题干了 *传送 1.定义 *如果图G(有向图或者无向图)中所有边一次仅且一次行遍所有顶点的通路称作欧拉通路. *如果图G中所有边一次仅且一次行遍所有顶点的回路称作欧拉回路. *具有欧拉回路 ...

  8. oracle11g忘记管理员密码

    oracle的sys和system密码是我们经常忘记的,忘记之后我们可以通过sqlplus来修改重置. 首先打开sqlplus:在运行处可直接输入打开 进入窗口后,首先输入 sqlplus/as sy ...

  9. XML--XML Schema Definition(一)

    参考 https://blog.csdn.net/wangw2008/article/details/83195283 https://blog.csdn.net/lmj623565791/artic ...

  10. QMainWindow的空间布局结构

    简单讲一下Qt的QMainWindow的结构,Qt的顶级窗口有三种类型,首先是万恶之源(...应该说是大部分控件的父类...)的QWidget,然后是QMainWidget和QDialog,后面两者也 ...