基本概念
图的定义
图是由顶点的非空有穷集合与顶点之间关系(边或弧)的集合构成的结构, 通常表示为
G = (V, E)
其中, V 为顶点集合, E 为关系(边或弧)的集合
如下图:
注:1、树可以空,图不可以;
图的分类
图可以分为以下三类:
名词术语
1、顶点的度:
依附于顶点vi的边的数目叫做顶点的度,记为TD(vi)
对于有向图而言, 有:
顶点的出度 :以顶点vi为出发点的边的数目,记为OD(vi);
顶点的入度 :以顶点vi为终止点的边的数目,记为ID(vi);
TD(vi) = OD(vi) + ID(vi)
关于顶点的度有如下结论:
1、对于具有n个顶点,e条边的图,有:
2、具有n个顶点的无向图最多有n(n-1)/2条边。
3、具有n个顶点的有向图最多有n(n-1)条边。
边的数目达到最大的图称为完全图 ;边的数目达到或接近最大的图称为 稠密图,否则,称为 稀疏图。
注:1、根据顶点数可以求出完全图的边数。
2、路径和路径长度
顶点vx到vy之间有路径P(vx,vy)的充分必要条件为:存在顶点序列 vx, vi1, vi2, …, vim, vy ,并且序列中相邻两个顶点构成的顶点偶对分别为图中的一条边
注:加粗部分的意思为 (vx,vi1), (vi1,vi2), … ,(vim,vy) 或<vx,vi1>, <vi1,vi2>, … ,<vim,vy> 都在E中。
如下图,A和E之间有两条路径:
出发点与终止点相同的路径称为回路或环;顶点序列中顶点不重复出现的路径称为简单路径。不带权的图的路径长度是指路径上所经过的边的数目,带权图的路径长度是指路径上经过的边上的权值之和。
3、子图
4、图的连通
1、无向图的连通
无向图中顶点vi到vj 有路径,则称顶点vi与vj是连通的。若无向图中任意两个顶点都连通,则称该无向图是连通的。
连通分量 —— 无向图中的极大连通子图,如下图:
注:1、是极大,不是最大;
2、有向图的连通
若有向图中顶点vi 到vj有路径,并且顶点vj到vi也有路径,则称顶点vi与vj是连通的。
若有向图中任意两个顶点都连通,则称该有向图是强连通的。
强连通分量 —— 有向图中的极大强连通子图,如下图:
5、生成树
包含具有n个顶点的连通图G的全部n个顶点,仅包含其n-1条边的极小连通子图称为G的一个生成树,如下图:
注:1、是极小连通子图;
存储方式
对于一个图,需要存储的信息应该包括:
1、所有顶点的数据信息;
2、顶点之间关系(边或弧)的信息;
3、权的信息(对于网络);
邻接矩阵存储方法
核心思想::采用两个数组存储一个图,步骤如下:
样例如下:
邻接矩阵存储方式有如下特点:
邻接表存储方法
核心思想:建立n个线性链表存储该图,步骤如下:
样例如下:
第i个链表中的每一个链结点(称之为边结点)表示以第i个顶点为出发点的一条边;邻接表存储方式有如下特点:
邻接链表方式表示图实际统计的是结点的出度,如果统计入度,则叫逆邻接链表
C语言实现如下:
#define
typedef struct edge{
int adjvex;
int weight;
struct edge *next;
}ELink; //定义边结点类型
typedef struct ver{
vertype vertex;
ELink *link;
}VLink; //定义顶点结点类型
VLink G[MaxV];