图论
图的存储
邻接矩阵 O(1) 查找 是否存在,大小
边表
1.最短路
floyd:
dijkstra:O(n^2+m)->(堆优化)->STL O((n+m)logm) 一个点加多次
->手写堆 O((n+m)logn) 避免重复加元素,支持直接改元素
图中没有负边 dis>=0
spfa:最坏 O(nm) 有负权直接用,
(bellman-ford)
2.生成树
最小生成树 prim
像dij????O((n+m)logm)不要求掌握
kruskal O(mlogm)
非严格次小生成树:n,m<=1e5 v<=1e9
n个点的完全图,有n^(n-2)个生成树 ->矩阵树定理
求出所有生成树
->优化:
最小生成树和次小生成树至少一条边不同
枚举删掉最小生成树上的哪条边,求最小生成树,最小的那个
有可能有多条边不同,但至少有那条边是不能用的
O(mlogm+(n-1)*[ma^(-1)(m)]) <-重新跑一遍并查集
约等于O(nm) 60'
最小生成树和次小生成树最多只有一条边不同:
枚举删掉哪条边,找最小的边加入O(n^2)
枚举加入哪条边,形成一个环,删掉在环上的一条最大的树边
对应树上一条链,->树上一条链最大值->倍增LCA
树->没有环的连通图 luogu????
3.强连通分量 10%
1.有向图的强连通分量 tarjan
2.无向图 边双联通分量->桥 ×
3.无向图 点双联通分量->割点 ×
强连通分量:有环的有向图->DAG DP
(求强连通分量)+DAG+拓扑排序+DP
DP:所有转移 有顺序
4.匹配 20%
二分图匹配:匈牙利算法:
网络流 ×
费用流 ×
匈牙利算法:
二分图:树(奇数深度的点,偶数深度的点)
网格图
二分图匹配问题:左边一个点最多能和右边一个点匹配....这个图最多能有多少个匹配
左边每个人按照顺序和右边每个人进行匹配
use数组保证复杂度,是否正在被要求匹配
邻接矩阵 O(n^3)
边表 O(nm) 和SPFA有同样的性质,一般跑不到