MST
1.Prim's Algorithm
O(V^2+E) 或 O((V+E)logV)
2.Kruskal's Algorithm
O(ElogE)
最小生成树还是最小化最大边的生成树
3.Cut property
利用环切性质,可以通过不断添加新边同时删去形成的环上的最大边得到生成树。另一方面,可以通过环切性质检验最小生成树。
4.Second minimum spanning tree
可以证明次小生成树和最小生成树互为邻树,所以只需根据环切性质进行最小差额添删操作即可。算法的瓶颈在于查询树上两点间的最大边,朴素的实现是O(V^2)的,事实上利用Tarjan算法可以O(V + E)出解。不计求解最小生成树,时间复杂度O(V + E)。
利用倍增算法,时间复杂度为O((V+E)logV)
5.Degree constrained spanning tree
除单点度限制生成树外,其他度限制生成树问题是NP-完全问题。
首先删去有度限制的节点V0,求得其他节点的最小生成树。
类似于次小生成树,不断地添加边(V0,Vi)并利用环切性质。不计求解最小生成树,时间复杂度O(dV )。
6.最优比率生成树
http://blog.csdn.net/willinglive/article/details/37937627
7.Kth minimum spanning tree
Shortest path
1.Triangle inequality
dis[u]+w[u][v]>=dis[v]
最短路转化为解不等式组问题
2.Dijkstra's Algorithm
O(V^2+E)或O((V+E)logV)
3.Floyd-warshall Algorithm
O(V^3)
dp[k][i][j]:经过前k条边 i -> j 的最短路
因此Floyd算法实质上是不断加点的最短路(题目)。
经过某些点(一般有先后次序)的最短路的求法。
k在i到j上的最短路的充要条件dis[i][k]+dis[j][k]=dis[i][j]
注意DP的理解
http://blog.csdn.net/willinglive/article/details/40461273
http://blog.csdn.net/willinglive/article/details/38688069
http://blog.csdn.net/willinglive/article/details/38368319
4.Minimum cycle
5.Bellman ford Algorithm & Shortest path faster Algorithm
O(VE)
SPFA是Bellman ford算法的改进
如果存在最短路,那么每个点入队不超过V次
SPFA可以利用Dijkstra算法堆优化达到O((V+E)logV)而且可以处理负环
7.Kth shortest path
7.1.Dijkstra
7.2.A*算法
8.System of difference constraints
SCC
LCA
1.Tarjan's Algorithm
2.Doubling Algorithm
3.Transformation to ±1 Range minium query
1.欧拉回路
2.哈密顿回路
最小支配集
1.无向图,二分图的最小支配集为NP
2.树:树形DP
http://blog.csdn.net/willinglive/article/details/39647117
3.平面图:平面图的最小支配集是O(log|V|)的
二分图
1.无向图是二分图的充要条件是不存在奇环,因此无根树是特殊的二分图
http://blog.csdn.net/willinglive/article/details/38130681
2.二分图一堆知识点
对于任意图:
|最小边覆盖|+|最大匹配|=|V|
二分图的最大匹配=最小点覆盖数
对于二分图:
以下数值等价.
最大匹配
最小点覆盖
|V|-最大独立集(二分图or有向无环图)
|V|-最小边覆盖数
|V|-最小路径覆盖数(有向无环图)
|V|-最小路径覆盖数/2(无向图)
(上面括号里有有向无环图的,均是将一个点拆成两个点连边匹配)
由于任意图的那几个几乎用不到于是这里只贴二分图的定义
最小点覆盖:理解为点覆盖边,即用最小的点覆盖所有的边。(若一条边的其中一个端点被选用,这条边就被覆盖了)
最大独立集:求一个最大的点集,里面的点不存在任何的边相连。
最小边覆盖:理解为边覆盖点,用最少的边把图中的点全部覆盖。
最小路径覆盖:用最少的路径把图中的所有点覆盖。
另外:最大独立集与最小覆盖集互补。
推广到有权的形式也一样,即最大点权独立集与最小点权覆盖集互补
求最小点权覆盖集可以这样求:
先对图黑白染色,然后向白色的点放X部,黑色的点放Y部。
1、连边[S,i],容量等于i的点权。(对于二分图的X集)
2、连边[i,T],容量等于i的点权。(对于二分图的Y集)
3、对于有边的i和j连边[i,j](i∈X,j∈Y),容量为INF
最后得出的最大流就是最小点权覆盖,实际上是最小割与之对应。
对于求了传递闭包以后的有向无环图:
最大反链=|V|-最大匹配
常用思想&处理技巧
反向构图
倍增思想
题库
http://blog.csdn.net/willinglive/article/details/38368049
参考资料
《Algorithm and Data structures Summary》——ftiasch
http://hi.baidu.com/edward_mj/item/7d7c46ac5bbaa83b030a4db9
《图论》——匡正非