图论总结

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

O(V^3)
4.1.设dis[i][i]=INF,跑一遍Floyd,最小的dis[i][i]即为所求
4.2.Floyd时枚举w[k][i]+dis[i][j]+w[j][k]

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

O(V)-O(1)
离线算法

2.Doubling Algorithm

O(VlogV)-O(logV)
在线算法

3.Transformation to ±1 Range minium query

O(VloV)-O(1)
在线算法,实现最为麻烦,不熟练容易写错


路径与回路

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://wenku.baidu.com/link?url=jVEOAc0owXCoeiX5awYGrFLhAVKj3koeft3FceKtzvqFEIGQLeTCV4EZiQw_NI8WGn8qbgEbNq-tmXmfOtMXKyGFvhbw0ICWyhcDR19ua3C

http://hi.baidu.com/edward_mj/item/7d7c46ac5bbaa83b030a4db9

《图论》——匡正非

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值