——本节内容为Bilibili王道考研《数据结构》P55~56视频内容笔记。
目录
一、邻接矩阵法
1.图示
(1)0表示两个顶点相互不邻接;
(2)1表示两个顶点相互邻接;
(3)无向图每条边对应两个1,有向图每条弧对应一个1;
(4)空间复杂度为,不适合存储稀疏图,适合存储稠密图;
2.结构体代码定义
#define MaxVertexNum 100 //顶点数目的最大值
typedef struct {
char Vex[MaxVertexNum]; //顶点表
int Edge[MaxVertexNum][MaxVertexNum]; //邻接矩阵,边表
int vexnum, arcnum; //图的当前顶点数和边数/弧数
}MGraph;
(1)顶点中可以存更复杂的信息;
(2)由于在邻接矩阵当中只需要存0和1两种状态,所以边表的数据类型可以改为bool型或枚举类型;
3.求顶点的度
(1)无向图:无向图第i个结点的度=第i行(或第i列)的非零元素个数;
(2)有向图:
①第i个结点的出度=第i行的非零元素个数;
②第i个结点的入度=第i列的非零元素个数;
③第i个结点的度=第i行、第i列的非零元素个数之和;
(3)邻接矩阵法求顶点的度、出度、入度的时间复杂度均为O(|V|);
4.邻接矩阵法存储带权图/网
(1)原本的0变∞,原本的1变权值,如图所示:
(2)结构体代码实现:
#define MaxVertexNum 100 //顶点数目的最大值
#define INFINITY INT_MAX //宏定义常量无穷
typedef char VertexType; //顶点的数据类型
typedef int EdgeType; //带权图中边上权值的数据类型
typedef struct {
VertexType Vex[MaxVertexNum]; //顶点
EdgeType Edge[MaxVertexNum][MaxVertexNum]; //边的权
int vexnum, arcnum; //图的当前顶点数和弧数
}MGraph;
5.邻接矩阵法的性质
(1)设图G的邻接矩阵为A(矩阵元素为0/1),则的元素等于由顶点i到顶点j的长度为n的路径的数目;
(2)例如:
二、邻接表法
1.图示:
(1)边链表中边结点的顺序可以不同;
2.代码实现:
typedef struct ArcNode { //边/弧
int adjvex; //边/弧指向哪个结点
struct ArcNode* next; //指向下一条弧的指针
//InfoType info; //边权值
}ArcNode;
typedef struct VNode { //顶点
VertexType data; //顶点信息
ArcNode* first; //第一条边/弧
}VNode,AdjList[MaxVertexNum];
typedef struct { //用邻接表存储的图
AdjList vertices;
int vexnum, arcnum;
}ALGraph;
3.求度、入度、出度
(1)无向图:遍历所求顶点对应的边链表,有多少个边结点该图的度就是多少;
(2)有向图:
①出度:遍历所求顶点对应的边链表,有多少个边结点该图的出度就是多少;
②入度:遍历所有顶点的边链表,查找指向某一个结点的弧。这是邻接表的缺陷,导致时间复杂度大大增加;