2020/11/1周总结

1差分约束

用来求解不等式组问题 或者具有不等关系的问题
若 边 a -> b 权值为c
<1> 求最小值 spfa跑最长路(d[y] < d[x]+w) B >= A + c
<2> 求最大值 spfa跑最短路(d[y] > d[x]+w) A + c >= B
<3> 求有无解 则看<1> <2>有无环
<4> 如果得到的解 还是初始化的值 则说明无约束条件

大致操作步骤
找到不等关系 建图 跑spfa 其中最短/长路 为不等式的解

常用方法 :
<1> 构造一个0 <= Si - Si-1 <= 1
<2> 判断负环时需要把各个点加入到队列
<3> 建立0与不等式的桥梁 这样就可以从0开始跑
<4> 利用取对数 将除法 变为 减法
<5> 添加偏差量,以免输入有负数

2 最近公共祖先lca

使用这个算法可以快速O(log n)的找出图中的两个点的路径

大致操作步骤
倍增做法 预处理O(nlogn) 查询(logn):
bfs 求各个点的深度 以及 跳多少步能到的父节点fa[a][k]
用求lca(a,b) 从最深的点a往上跳 跳到和b一样的深度 时如果已经是最近公共祖先就返回,否则就继续跳,跳到公共祖先一样为止

tarjan离线做法O(n + m):
离线做法:先读完,再全部处理,最后全部输出。

首先先要存储 将要查询的数组Q
在深度优先遍历时,将所有点分成三大类

2号点:代表已经访问并结束回溯

1号点:代表正在访问

0号点:代表还没有访问过

其中所有2号点和正在搜索的1号点路径中已经通过并查集合并成一个集合

应用
<1>求点x到y的距离: Dist = d[x] + d[y] - 2*d[lca]
<2>利用lca的倍增思想 求出 路径到最近公共祖先 的 最大/最小/次大/次小 边:
d[x][k] = max/min(d[fa[x][k-1]] , d[x][k-1]);
<3> 次小生成树:对于一张无向图,如果存在最小生成树和(严格/非严格)次小生成树,那么对于任何一颗生成树,都存在一颗(次小生成树(严格/非严格)),使得这两棵树只有一条边不同
<4> lca树上差分(这个还不是很熟)

刷题截图:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值