有关图的几个经典算法

一、最小生成树算法

1、Kruskal算法

· 利用最小堆和不相交集来实现

· 最小堆中结点的格式

有关图的几个经典算法_第1张图片

·在构造最小生成树过程中,取最小堆的根结点,若该边两个顶点不属于同一个连通分量,则取该边,否则拿掉该根结点继续然后接着取最小堆的根结点进行判断。


2、prim算法

· 从连通网络N = {V,E }中的某一顶点u0出发,选择与它关联的具有最小权值的边 ( u0,v ),将其顶点加入到生成树顶点集合U中。

以后每一步从一个顶点在U ,另一个顶点不在U 的各条边中选择权值最小的边(u,v),把它的顶点加入到集合U 中。如此继续下去,直到网络中的所有顶点都加入到生成树顶点集合 U中为止。

· 使用邻接矩阵或者vector来存储图 


Kruskal算法与prim算法的比较:

· prim算法的时间复杂度为O(n^2),适用于边稠密的网络,(若用邻接矩阵表示)不适用于边稀疏的网络

· Kruskal算法使用于边稀疏的网络


二、最短路径

1、用Dijkstra算法求有向带(非负)权值图的单(多)源最短路径


算法思想略,算法步骤如下:

有关图的几个经典算法_第2张图片

看图更直观:


每次以不同的顶点为源便可以求得每一对顶点之间的最短路径,时间复杂度为O(n^3)。


2、用Floyd算法求有(无)向带任意权值图的多源最短路径

直接看:Floyd算法

时间复杂度同为O(n^3),但该算法更直观,更容易实现


注意:若图中存在负权值,但不存在带负权值的回路时,Floyd算法可以正常执行,而Dijkstra算法则不行。


三、拓扑排序


· 在AOV网络中,不能有环

· 检查网络是否有环的方法:对有向图的顶点进行拓扑排序,若若有顶点都在其拓扑有序序列中,则无环。


算法思想(用栈实现):

1 、AOV网中选择一个没有前驱的顶点且输出;

2 、AOV网中删除该顶点以及从该顶点出发的(以该顶点为尾的弧)所有有向弧() ;

3、 重复1、2,直到图中全部顶点都已输出(图中无环)或图中不存在无前驱的顶点(图中必有环) 

时间分析:设有n个顶点,e条边,则时间复杂度为O(n+e)




你可能感兴趣的:(算法笔记)