图论基础——类实现——绪论
序言
欢迎来到我的第一篇博客,作为一个初次尝试类似类型的博客的新人,难免会出现各种语言解释不够清晰,代码出现bug的情况,还望看客能够包容,并友善提出错误。
写这篇博客的原因,主要在于我近期正在上的图论理论课。在这堂课上,老师系统地讲解有关图论的 基础知识,以及各种推论,以及算法,并辅以算法OJ测验。其间在对图的各种算法的实现过程中,我发现每次实现一个算法,都要根据算法特征重新考虑图的储存方式,并利用数组、哈希表等的组合来配合算法进行具体的实现。这种方式虽然能够最大化利用存储,提高效率,也符合一般ACM竞赛的写代码方式,但是在应对大量图算法的时候就有些捉襟见肘,且极其容易在某个不易察觉的地方出错,而这种错误在图的算法中很难被检测出来。
因此,我就想要在网上寻找一些能够满足基本图的性质,以及相应算法的C++类库,但很遗憾的是,虽然网上能够找到大量用C/C++,JAVA实现的算法,却很少有人能系统地将图结构进行封装,并将图与图的算法分离开,使得相比于关注图的内部实现,在图上运行的算法更加令人容易理解。
实际上,目前大多数基础的图算法,其依赖的图操作往往只有少数几个,且往往是从邻接顶点或邻接边开始的,例如以下几个图算法:
图算法 | 依赖操作 | 推荐图结构 |
---|---|---|
最短路径(Dijkstra) | 访问邻接边 | 邻接表 |
最短路径(Floyd) | 访问任意边 | 邻接矩阵 |
最大团 | 访问邻接边 | 邻接表 |
最大匹配 | 访问邻接边 | 邻接表 |
最小生成树(Kruskal) | 提取最小边 | 邻接多重表 |
AOV网络最短路径 | 访问邻接边 | 邻接表 |
可以看到,大多数图算法都只需要访问邻接顶点/边的操作,对应的图结构是邻接边;偶尔会出现访问任意边,对应于邻接矩阵;而对于一些特殊的要求,例如提取最小边等,所需要的邻接多重表也可以直接通过邻接矩阵,利用 指针的方式 来实现。
因此,我们可以借此将图的结构与图算法的实现分隔开来,在图算法中,利用图类提供的抽象接口来实现相关操作。此外,利用C++的抽象类功能,可以将图类的接口与图结构的具体实现分离开,使得形成一个图算法使用图接口,图结构填充图接口的层次结构形式,运用类的多态性(多继承)可以实现这一功能, 具体如下:
在以后的博客中,我会陆续从以下的角度更新该话题的内容:
- 图的抽象类及其继承关系
- 图的具体实现
-
- 邻接矩阵
-
- 邻接表
- 算法类的继承关系
- 各种图算法的实现