图的概念:
包含
- 一组顶点:通常用V(Vertext)表示顶点集合
- 一组边:通常用E(Edge)表示边的集合
边是顶点队:(v, w)∈ E, 其中v,w∈V
有向边
抽象数据类型定义
类型名称:图(Graph)
数据对象集:G(V, E)由一个非空的有限顶点集合V和一个有限边集合E组成。
操作集:对任意图G∈Graph,以及v∈V, e∈E
-Graph Create( ):建立并返回空图;
-Graph InsertVertext(Graph G, Vertex v):将v插入G;
-Graph InsertEdge(Graph G, Edge e):将e插入G;
- void DFS(Graph G, Vertext v):从顶点出发深度优先遍历图G;
- void BFS(Graph G, Vertext v):从顶点v出发宽度优先遍历图G;
- void ShortestPath(Graph G, Vertex v, int Dist[]):计算图G中顶点v到任意其他顶点的最短距离;
图的表示
例如如下一张图:
该怎么在程序中表示他们的呢?
实际上我们想要表示的是这些顶点之间的关系。
但是这又怎么表呢?
其实可以使用邻接矩阵来表示:
邻接矩阵G[N][N]——N 个顶点从0 到N-1 编号
G[i][j] =1 若<v i ,v j > 是G的边
G[i][j] = 0 若<v i ,v j > 不是G的边
使用矩阵表示下来之后就是这个样子:
但是对于这样一个图表示之后我们会发现沿着对角线是对称的,为什么呢?
实际上这种表示方法将两个顶点之间的边表示两次,这是无向图,就比较的浪费空间,我们就可以在计算机中存储矩阵的一部分例如:
这样就可节省很多空间: