10.1.概念
定义:
图,用来表示多对多的关系,比如地图里城市之间的通路、比如人际关系。
图由顶点和边组成,顶点是图里的每个结点,边是顶点之间的通路,可以一条边都没有,但是不能一个顶点都没有。
分类:
图按照边分,可分为两种:
- 有向图,边是有方向的,A—>B表示A可以到B,B不能到A。
- 无向图,边是无方向的,A—B表示A可以到B,B也可以到A。
图按照点与边的数量,可分为两种:
- 稀疏图,点多边少
- 稠密图,点少边多
- 完全图,特殊的稠密图,每个顶点间都有边相连。
符号表示:
顶点集合 |
V |
边的集合 | E |
无向边 |
(V,W),表示V,W双向连通 |
有向边 | <V,W>,表示V—>W。 |
10.2.存储
图有两种存储方式:
- 邻接矩阵
- 邻接表
10.2.1.邻接矩阵
邻接矩阵,用一个二维的数组表示图。
G[i][j]=1,表示V(i)、V(j)之间有一条边。
G[i][j]=0,表示V(i)、V(j)之间没有边。
以一个无向的稀疏图的存储为例:
A | B | C | D | E | |
A | 0 | 1 | 0 | 0 | 1 |
B | 1 | 0 | 1 | 1 | 0 |
C | 0 | 1 | 0 | 1 | 0 |
D | 0 | 1 | 1 | 0 | 1 |
E | 1 | 0 | 0 | 1 | 0 |
可以看到用邻接矩阵存放点多边少的图,会存在大量记录都是0,没有任何意义,浪费了大量内存,因此,邻接矩阵适合存放稠密图(尤其是完全图)、不适合存放稀疏图(会有大量内存被浪费)。
10.2.2.邻接表
邻接表,用一组链表来表示图,每一条链表表示某个顶点和其他顶点的连同关系。
以一个稠密的无向图的存储为例:
可以看到邻接表里单个结点间的连接关系被多次重复描述也浪费了不必要的内存,因此,邻接矩阵适合存放稀疏图、不适合存放稠密图。