一、图的定义和术语
这些概念看图能理解就行,详细可参考优快云收藏夹中的专栏
图(Graph)——图G是由两个集合V(G)和E(G)组成的,记为G=(V,E)
其中:V(G)是顶点的非空有限集;E(G)是边的有限集合,边是顶点的无序对或有序对
有向图——有向图G是由两个集合V(G)和E(G)组成的,
其中:V(G)是顶点的非空有限集;E(G)是有向边(弧)的有限结合,弧是顶点的有序对,记为<v,w>,v,w是顶点,v是弧尾,w为弧头
无向图——无向图G是由两个集合V(G)和E(G)组成的
其中:V(G)是顶点的非空有限集;E(G)是边的有限结合,边是顶点的无序对,记为(v,w)或(w,v),并且(v,w)=(w,v)
有向完备图——n个顶点的有向图最大边数是n(n-1)
无向完备图——n个顶点的无向图最大边数是n(n-1)/2
权——与图的边或弧相关的数
网——带权的图
子图——如果图G(V,E)和图G1(V1,E1),满足:,
,则G1为G的子图
顶点的度
(1)无向图中,顶点的度为与每个顶点相连的边数
(2)有向图中,顶点的度分成入度与出度。
入度:以该顶点为头的弧的数目
出度:以该顶点为尾的弧的数目
路径——路径是顶点的序列,
满足或
,
路径长度——沿路径边的数目或沿路径各边权值之和
回路——第一个顶点和最后一个顶点相同的路径叫~
简单路径——序列中顶点不重复出现的路径叫~
简单回路——除了第一个顶点和最后一个顶点外,其余顶点不重复出现的回路叫~
连通——从顶点V到顶点W有一条路径,则说V和W是连通的
连通图——图中任意两个顶点都是连通的叫~
连通分量——非连通图的每一个连通部分叫~
强连通图——有向图中,如果对每一对,从Vi到Vj和从Vj到Vi都存在路径,则称G是~
二、图的存储结构
多重链表存储密度低,空间浪费大,一般不用
(一)邻接矩阵
表示顶点间相联关系的矩阵
1. 定义:
设G=(V,E)是有个顶点的图,G的领接矩阵A具有以下性质的n阶方阵:
图示:
2. 特点:
(1)存储空间
- 无向图的邻接矩阵对称(对称矩阵),可压缩存储;有n个顶点的无向图需存储空间为n(n+1)/2
- 有向图领接矩阵不一定对称;有n个顶点的有向图需存储空间为n^2
(2)空间复杂度:
或 
- 只与顶点数相关,与边数无关
- 适用于顶点少,边多(稠密图)的情况。( 若边较少,二维数组会出现大量的空间浪费)
(3)顶点的度
- 无向图:顶点Vi的度=第i行(或第i列)的非零元素个数
- 有向图:顶点Vi的出度是A中第 i 行元素之和,顶点Vi的入度是A中第 i 列元素之和
- 邻接矩阵中的数值没有-1!!只有0、1 .
- 邻接矩阵法求顶点的度、出度、入度的时间复杂度均为O(|V|)或O(n);
3. 结构体代码实现
Vex顶点表,存放顶点信息
Edge领接矩阵
#define MaxVertexNum 100 //顶点数目的最大值
typedef struct {
char Vex[MaxVertexNum]; //顶点表,存放顶点信息
int Edge[MaxVertexNum][MaxVertexNum]; //邻接矩阵,边表
int vexnum, arcnum; //图的当前顶点数和边数/弧数
}MGraph;
(1)顶点中可以存更复杂的信息;
(2)由于在邻接矩阵当中只需要存0和1两种状态,所以边表的数据类型可以改为bool型或枚举类型;
4.邻接矩阵的性质
设图G的邻接矩阵为A(矩阵元素为0/1),则的元素
等于由顶点i到顶点j的长度为n的路径的数目;
例如(第一个应该是从A到D):
5. 网络的邻接矩阵/带权值
原本的0变∞,原本的1变权值
(二)关联矩阵
表示顶点与边的关联关系的矩阵
1.定义:
设G=(V,E)是有个顶点,
条边的图,G的关联矩阵A是具有以下性质的
阶矩阵
(1)有向图:
A[i,j]=1,顶点与
边相连,且
为尾
=0,顶点与
边不相连
=-1,顶点与
边相连,且
为头
(2)无向图
A[i,j]=1,顶点与
边相连
=0,