图论
- 最短路
- 生成树
- 强连通
- 差分约束
- 拓扑排序
- 欧拉图
最短路
1.建模:
将原问题转化通过某种性质转化为图论问题
注意:
- 建图的时候是否可以优化(是否加了一些对答案无影响的边)
- 和某些特定数量的点有关,考虑枚举。(枚举时也可以优化,比如只枚举前几个,便可以推出最后一个,诸如此类)
- 一些需要用到的值,考虑预处理。枚举+拼凑答案
可以建模的情况:
- 最值(e.g.墨墨的等式)
2.变形:
- dijkstra处理的是单源最短路径,但通过增加一个超级源点,也可以处理多源最短路径
- 最短路计数
- 次短路,枚举最短路上的每一条边看是否可以更新答案
- 分层图:理解每一层的含义,注意连边
- 最短路树:特别适用于源点到每个节点的最短路唯一的情况。(题目往往需要处理非树边。并查集的妙用:判断两点是否被更新过)
3.细节:
- 判断一条边是否存在于最短路上,需要从起点和终点开始各做一次最短路。 d i s [ S ] [ u ] + d i s [ v ] [ T ] + w [ u ] [ v ] = = d i s [ S ] [ T ] dis[S][u]+dis[v][T]+w[u][v]==dis[S][T] dis[S][u]+dis[v][T]+w[u][v]==dis[S][T]
生成树
1.变形:
- 最小度限制生成树
- 最优比率生成树(0/1分数规划)
- 最小乘积生成树
- 最小生成树计数
- Kruskal重构树
- 最小瓶颈路
- 动态维护最小生成树
强连通
Tarjan
- 有向图
- 无向图
差分约束
一定要注意隐含条件
拓扑排序
应用广泛
欧拉路
1.判断是否存在欧拉回路
对于有向图 — 每个点的出度 =入度,(且图联通)
对于无向图 — 每个点的度数为偶数,(且图联通)
2.求解欧拉回路
动态规划
- 线性dp
- 区间dp
- 树形dp
- 数位dp
- 斜率优化dp
- 状压dp
- 概率期望do
线性dp
其实不只是对于线性dp,大多数dp题在定义状态的时候,就是把你所需要的全部列出来,然后再分析简化。
状态一定要明确
区间dp
感觉做到的区间dp都一个样。
记忆化搜索
树形dp
常见的状态定义:
f
[
i
]
[
.
.
.
]
[
.
.
.
]
f[i][...][...]
f[i][...][...]表示以i为根的子树的…信息
数位dp
- 求满足限制的第k小的数(可以先确定大致位数,然后运用试填法)
- 求区间[l,r]之内满足限制的数的个数(看作是 [ 1 , r ] − [ 1 , l − 1 ] [1,r]-[1,l-1] [1,r]−[1,l−1])
斜率优化dp
和平时推式子没什么两样
只是变个形优化一下
y
=
k
∗
x
+
b
y=k*x+b
y=k∗x+b
x
,
y
x,y
x,y只和决策信息有关
k
,
b
k,b
k,b只和当前状态有关
- 合并同类项的时候要细心
- 注意初值
状压dp
一般可以从数据范围获得提示
将状态存下来(然后就和枚举没什么两样)
注意状态的定义一定要涵盖所有情况(比如NOIP宝藏)
概率期望dp
暂时放这儿。
这周没来得及写