1 图的基本概念
有向图和无向图
顶点、弧、出度/入度
边、邻接点
连通图
对于无向图中的每一个顶点,都能找到一个通往其它任意一个顶点的路径(直接或间接),则构成连通图
。
完全图
在一个无向图中,任意两个顶点之间都存在连线,则构成完全图
。
生成树
顶点和最小数量能连接这些顶点的边,构成生成树。
2 图的存储结构、遍历方式及最小生成树算法原理
2.1 图的存储结构
邻接多重表
,基于链表,用于无向图
有向图和无向图的存储结构有所不同,比如常用的存储结构
2.1.1 邻接矩阵
说明:基于数据,有向图、无向图均可。
权值
为弧赋于权值
,为算法提供依据。
顶点
1 | // 顶点 |
弧或边的表示方法
说明:基于数组实现,实现简单,容易理解,用来实现边(无向图)或弧(有向图)。
有向图的邻接矩阵
无向图的邻接矩阵
1 | // 图 |
2.1.2 邻接表
说明:基于链表,用于有向图。邻接表有两类
邻接表
,和顶点关联的弧链表记录的是出弧信息逆邻接表
,和顶点关联的弧链表记录的是入弧信息
邻接表
1 | // 顶点 |
2.1.3 十字链表
说明:基于链表,用于有向图。
1 | // 顶点 |
2.1.4 邻接多重表
说明:基于链表,用于无向图。
1 | // 边 |
2.2 图的遍历
深度优先搜索
广度优先搜索
2.3 最小生成树
2.3.1 什么是最小生成树
使所有点连通的成本最小的边和点的集合构成最小生成树。如下,左边是图,右边是计算得到的最小生成树。
2.3.2 获取最小生成树
说明:常用的计算最小生成树的两个方法
普里姆 (Prim) 算法
把以当前选中的点为顶点的所有边作为下一步的待选边集合,选出待选边集合中权重最小的边,加入边集合,更新点集合。重复此步骤,直到所有点都进入了点集合。
通过下面的例子来说明。下面是计算的每一步骤。
(1)
(2)
(3)
(4)
(5)
克鲁斯卡尔 (Kruskal) 算法
把所有边都做为待选边集合,选出待选边集合中未选择的边中权重最小的边,加入边集合,更新点集合。重复此步骤,直到所有点都进入了点集合且点都连通在一起。
通过下面的例子来说明。下面是计算的每一步骤。
(1)
(2)
(3)
(4)
(5)
3 图的存储与遍历
1 | . |
main.cpp
1 |
|
CMap.h
1 |
|
CMap.cpp
1 |
|
Node.h
1 |
|
Node.cpp
1 |
|
4 图的最小生成树算法
1 | . |
main.cpp
1 |
|
CMap.h
1 |
|
CMap.cpp
1 |
|
Edge.h
1 |
|
Edge.cpp
1 |
|
Node.h
1 |
|
Node.cpp
1 |
|