图论总结

图论总结
这几天我们将图论复习完了,现在系统的总结一下图论相关知识。我觉得图论就是分为算法应用和建图技巧。

1. 最短路:

最短路分为单源最短路和任意两点最短路
单源最短路:
单源最短路大致有两种算法:

Dijkstra:

这是在最短路中经常使用的算法,原本的复杂度是n方的,可以用堆优化将其优化到稳定的mlogn,不会被卡。(其实这个算法的时间复杂度为(m+n)logn)只不过省略了n,但有时后数据较大还要考虑到这一点。

这个算法还有一个缺点就是不能处理负边权,更别说负环了,因为Dijkstra是基于贪心的思想来完成的最短路。

Spfa&&Bellman—Ford算法:

这个算法基于三角不等式完成最短路的有dis[y] 关于复杂度:Bellman—Ford时间复杂度是nm的比Dijkstra慢,不建议使用。
关于spfa,它其实是队列优化的Bellman—Ford算法,在随机数据中它的效率很高,但是出题人可以用蒲公英图加链式诱导将spfa退化成nm。
所以能用Dijkstra时尽量不用spfa。
但是spfa有个好处就是它能处理负边权,这个好处是非常实用的。
再总结一下这两种算法的细节:
Dijkstra再出队的时候不用清除vis标记,而spfa出一次队就要清一次标记,入一次队就要打一次标记。
任意两点最短路
这个就是人人都知道的著名的Floyed算法。
这个算法是基于Dp的思想,来完成的最短路。其实这个算法的应用,变通很灵活。有时需要根据DP的思想进行变通。
这个算法的复杂度是N3方的,常用来处理小规模稠密图。

最小生成树

最小生成树有两种算法一个就是非常常用的Kruskal算法和不常用的Prime算法
关于最小生成树的一个定理:

  1. 任意一颗最小生成树一定包含无向图中权值最小的边。
    Kruskal就是根据贪心的思想求出一个无向图的最小生成树。复杂度是mlogm

Tarjan与有向图

Tarjan是一个很优秀的算法,能够在n的复杂度内求解出很多有用的信息。
Tarjan与有向图主要就是缩点。

缩点在一些较难的图论题中经常遇到,这是必备一项技能,同样,与缩点之后,整张图就变成了一个DAG(有向无环图),与之配套的算法就可衍生出最短路,拓扑。。。。非常灵活,但这种题的码量一般较大,属于难题。

Tarjan与无向图

Tarjan与无向图的关系就更为复杂,主要应用有割点,桥,点双,边双(由于后两者超出了NoIP的范围所以我在此不做总结)

简单说一下Tarjan与无向图的连通性——割点和桥。
割点就是去掉的个点 无向图不连通的点叫做割点,在Tarjan算法中的判定法则是至少有1个点y满足dfn[x]<=low[y];特别的如果这个点是根节点,必须至少存在两个上述的点。
桥就是删除一条边之后无向图的不连通的边叫做桥。无向边是桥,当且仅当至少存在一个点满足:dfn[x]

定理:一个简单环环中的边一定都不是桥。

差分约束

图论总结_第1张图片

二分图

二分图的定义: 一张图是二分图,当且仅当图中不存在长度为奇数的环。

判断一个图是否十二分图的方法就是染色法可以在n+m的时间复杂度内完成。
二分图的最大匹配:
这个就是二分图最常用的地方:
二分图匹配主要难点就是在建图上面:
二分图匹配的模型有两个要素:
‘0’要素:节点能分成独立的两个集合,每个集合内部有0条边
‘1’要素:每个节点只能与一条匹配边相连
这就是二分图匹配的两个要素,抓住了这两个要素之后,整道题就差不多解决了。
再来说一下二分图匹配的算法:
匈牙利算法:时间复杂度(nm)基于贪心策略;
就是 一个dfs的模型很好写但是复杂度较高。
还有一种算法就是网络流中的最大流算法(Dinic算法)时间复杂度是m根号n效率较高但是码量较大,不是很好写。

你可能感兴趣的:(图论)