图也是重点,和树结合考虑,因为很多应用就是把图生成一颗树。图逻辑关系是结点集合和
边集合,但怎么怎么存图到计算机中:顺序存储用邻接矩阵,链式存取用邻接表,这两种存
储方式都要会,即不仅仅看到逻辑关系的图是图,用邻接矩阵或邻接链表表示的也是图。图
的遍历:深度优先搜索生成树用栈,广度优先搜索生成树用队,要会用它们求连通分量。几
种图的应用,拓扑排序求是否有环路(有向无环图),关键路径的求法(会画表格求法即可),
会用 Prim 算法求最小生成树,会用 Dijkstra 算法求最短路径生成树(即 D[n]向量的计算)。
一 图的概念
- 定义:数据结构中有线性结构(前驱和后继的关系)、树型结构(层次关系),图是一种结点具有任意关系的结构。
- 术语:无向图,边,度;有向图、弧、出度入度,头和尾;
稀疏图;
子图;
赋权图即网;
无向图可能是连通图,有向图可能是强连通图;无向图中的连通分量,有向图中的强连通分量;
联通图的生成树:n个结点、n-1条边;
二 图的存储结构
- 数组表示法——邻接矩阵表示法
图没有顺序映像的存储结构,但可以借助数组的数据类型表示元素之间的关系
typedef enum{DG,DN,UDG,UDN}GraphKind; //枚举图的 4 种类型
typedef struct {
VRType adj; //对于无权图,用 1 或 0 表示是否相邻;对于带权图,直接为权值,若无权值用无穷。
InfoType * info; //弧或边额外含有的信息指针
}ArcCell,AdjMatrix[MAX_VERtEX_NUM][MAX_VERtEX_NUM]; //数据元素(结点)之间的关系
typedef struct {
VertexType vexs[MAX_VERtEX_NUM]; //存储图中顶点数据
AdjMatrix arcs; //二维数组,记录顶点之间的关系
int vexnum,arcnum; //记录图的顶点数和弧(边)数
GraphKind kind; //记录图的种类
}MGraph;
- 链式存储结构——邻接表
n个顶点对应n个单链表,n个单链表的表头又以顺序结构存储、相连接。
单链表有一个表头结点和许多表结点。注意:有向图的表结点是以结点为尾的弧的头,尾就是“出去的头”