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树上差分(这个还不是很熟)
刷题截图:
![](https://i-blog.csdnimg.cn/blog_migrate/ae1d711706c819189b1d9caa7478d619.png#pic_center)
![](https://i-blog.csdnimg.cn/blog_migrate/d9c56a9521109c854ede70e39b89b8aa.png#pic_center)
![](https://i-blog.csdnimg.cn/blog_migrate/0ead6b4b1a6cf8be05aa8798b1adab11.png#pic_center)
![](https://i-blog.csdnimg.cn/blog_migrate/cd77e733b4b90ea7fd5863f3a7f7ad51.png#pic_center)