多对多
- 无向图的**邻接矩阵对称**,可压缩存储;有 **n 个顶点**的无 向图所需**存储空间为 n(n-1)/2**。
- **有向图的邻接矩阵不一定对称**;有** n 个顶点的有向图所 需存储空间为 n²**,用于稀疏图时空间浪费严重。
- 无向图中**顶点 vi 的度 TD(vi) 是邻接矩阵中第 i 行 1 的个数**。
- 有向图中:顶点vi的**出度**是邻接矩阵中第i行1的个数;顶点vi的入度是邻接矩阵中第i列1的个数。
#define INFINITY INT_MAX // 最大值∞
#define MAX_VERTEX_NUM 20 // 最大顶点个数
typedef enum {DG, DN, UDG, UDN} GraphKind;
//{有向图,有向网,无向图,无向网}
typedef struct ArcCell {
VRType adj; // VRType是顶点关系类型。对无权图用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;
(1) 分为两个节点:头结点:含有两个域一个数据域用来存储vi的名或其他有关的信息
表结点:含有三个域,分别是邻接点域,用来存放与vi邻接的顶点在表头数组中的位置;链域:用来指示下一条边或弧。info域用来存储与边或弧相关的信息,如权值等等
info:书上是如权值等 ,如果是个实际问题,比如求带限制条件的最短路径或者最小生成树,那么就可加上Info信息。
(2) 特点:
#define MAX_VERTEX_NUM 20
typedef struct ArcNode {
int adjvex; // 该弧所指向的顶点的位置
struct ArcNode *nextarc; // 指向下一条弧的指针
InfoType *info; // 该弧相关信息的指针
} ArcNode;
typedef struct VNode {
VertexType data; // 顶点信息
ArcNode *firstarc; // 指向第一条依附该顶点的弧
} VNode, AdjList[MAX_VERTEX_NUM];
typedef struct {
AdjList vertices;
int vexnum, arcnum; // 图的当前顶点数和弧数
int kind; // 图的种类标志
} ALGraph;
顶点节点:数据域、第一条入弧(firstin)、第一条出弧(firstout)
#define MAX_VERTEX_NUM 20
typedef struct ArcBox {
int tailvex, headvex; // 该弧的尾和头顶点的位置
struct ArcBox *hlink, *tlink;
// 分别指向下一个弧头相同和弧尾相同的弧的指针域
InfoType *info; // 该弧相关信息的指针
} ArcBox;
typedef struct VexNode {
VertexType data;
ArcBox *firstin, *firstout; // 分别指向该顶点第一条入弧和出弧
} VexNode;
typedef struct {
VexNode xlist[MAX_VERTEX_NUM]; // 表头向量
int vexnum, arcnum; // 有向图的当前顶点数和弧数
} OLGraph;
不讲
7.3.1 深度优先遍历
连通图的深度优先遍历类似于树的先根遍历
方法:1、访问指定的起始顶点;
2、若当前访问的顶点的邻接顶点有未被访问的,则任选 一个访问之,转2;反之,退回到最近访问过的顶点;直到与起始顶点相通的全部顶点都访问完毕;
3、若此时图中尚有顶点未被访问,则再选其中一个顶点 作为起始顶点并访问之,转 2; 反之,遍历结束。
7.3.2 广度优先遍历
方法:从图的某一结点出发,首先依次访问该结点的所有邻 接顶点 Vi1, Vi2, …, Vin 再按这些顶点被访问的先后次序依次访问 与它们相邻接的所有未被访问的顶点,重复此过程,直至所有顶 点均被访问为止。
实现:用队列进行实现,如果一个节点没有孩子则队头就进行出队操作;
7.4.3 最小生成树
最小生成树:给定一个无向网络,在该网的所有生成 树中,使得各边权数之和最小的那棵生成树称为该网的最 小生成树,也叫最小代价生成树。