图论模板
这里放了最基础的图论内容在本文中maxn
为最大点数,maxm
为最大边数.
链式前向星
以下代码存图所用链式前向星皆用这个模板
注意访问时的顺序与输入时是相反的。
|
拓扑排序
在建边时先预处理入度,即代码中的vin
|
最短路
floyd
注意到最外层枚举的是中转点
|
dijkstra
论某个傻瓜曾经还在用手写堆
正确性?
设正确答案的 的长度为 , 为 到 的边权。反证法,设 为第一个使得在出队列时 的,将 加入堆的点为 ( 此时已经求出正确答案)。此时正确路径上必有点 , 使得 , 不为空路径且 已求出答案, 没有。注意到由于优先队列的性质,于是有:
显然没有大于自己的数,矛盾。
|
spfa+负环判断
|
差分约束
就一句话:对于 的条件,我们只要由 向 建长度为 的边,然后狂跑最短路就结束了。
0-1bfs
很不错的例题:P1948 [USACO08JAN]Telephone Lines S
|
关于DAG
显然,在DAG中,无论权值是否为负,比一个点拓扑序小的点全松弛完毕后,这个点的最短路就求出来了(因为显然每个点都只能从比自己拓扑序小的点走到)。
-
代码几乎和拓扑排序一模一样,不放了。
联通性
有向图缩点(tarjan)
-
显然将强连通分量都看成一个点后,新图是个DAG,这时(以下代码中的) 即为 所属的点反过来的拓扑序。
|
边双联通分量-tarjan(桥)[1]
相对点双联通分量,边双联通分量比较特殊,可以直接 。
连接两个边双联通分量的必为割边
模板P8436的代码如下:
|
点双联通分量-tarjan(割点)
连接两个点双联通分量的必为割点
模板:P8435。
代码如下:
|
二分图
二分图最大匹配
|
二分图最大权完美匹配(KM算法)
模板题传送门
网络上讲得详细的题解比较少,洛谷题解较为详细却没有注释,因此打题的时候加了注释。
|
关于树
最近公共祖先(LCA)
我知道树链剖分自带这个。所以这里只有倍增……
预处理部分:
|
干活部分:
|
树链剖分
|
关于网络流
存个模板,放个链接.
最大流/最小割
最小割模型:若题目可以转为为一些点,每个点有双态,把点分在两个态中会产生花费,并且条件可以表示为“若 A 在 C 态,则 B 也在 C 态”的,可以考虑使用最小割求最小花费。
EK
|
DINIC
|
费用流/最小费用最大流
dinic+spfa
|
差分远比看起来难写,差评! ↩︎