一、图的定义
在计算机科学中,一个图就是一些顶点的集合,这些顶点通过一系列边结对(连接)。顶点用圆圈表示,边就是这些圆圈之间的连线。顶点之间通过边连接。
二、图的基本术语
无向图:每条边都是无方向的
有向图:每条边都是有方向的
完全图:任意两个点都有一条边相邻
稀疏图:有很少边或弧的图
稠密图:有较多边或弧的图
网:边、弧带权的图
邻接:有边、弧相邻的两个顶点之间的关系
关联:边、弧与顶点之间的关系
顶点的度:与该顶点相关联的边的数目
路径:接续的边构成的顶点序列
路径长度:路径上边或弧的数目、权值之和
回路:第一个顶点和最后一个顶点之间的路径
简单路径:除路径起点和终点可以相同外,其余顶点均不相同的路径
简单回路:除路径起点和终点相同外,其与定点均不相同的路径
连通图:在有(无)向图G中,若对任何两个顶点u、v都存在从v的路径,则称G为连通图
权与网:图中边与弧所具有的相关数称为权,表明从一个顶点到另一个顶点的距离或耗费
子图:设有两个图G=(V,{E})、G1(V1,{E1}),若V1属于V,E1属于E,则称G1是G的子图
连通分量:无向图G的极大连通子图称为G的连通分量
三、图的类型定义
代码如下:
ADT Graph{
数据对象V:具有相同特性的数据元素的集合,则称为顶点集
数据关系R:R={VR}
}
四、图的存储结构
1、数组(链接矩阵)表示法
(1)建立一个定点表(记录各个顶点信息)和一个邻接矩阵(表示各个顶点之间的关系)
(2)设置A=(V,E)有n个结点
(3)图的邻接矩阵是一个二维数组
代码如下:
#define MVNum 100
typedef char VerTexType;
typedef int ArcType;
typedef struct{
VerTexType vexs[MVNUM];
ArctYPE ARCS[MVNum][MVnum];
int vexnum,arcnum;
}AMGraph
缺点:(1)不便于增加和删除顶点
(2)浪费空间,稀疏图有大量无效元素
(3)浪费时间,统计稀疏图中有多少边
(4)不便于增加和删除顶点
2、链接表表示法
(1)输入总顶点数和总边数
(2)建立顶点表,一次输入点的信息存入顶点表中,使每个表头结点的指针域初始化为NULL
(3)创建邻接表,一次输入每条边依附的两个顶点,确定两个顶点的序号i和j,建立边结点,将此边结点分别插入到vi和vj对应的两个边链表的头部
代码如下:
typedef struct VNode{
VerTexType data;
ArcNode *firstarc;
}VNode,AdjList[MVNum];
Status CreatUDG(ALGraph &G){
cin>>G.vexnum>>G.arcnum;
for(i=0;i<G.vexnum;i++){
cin>>G.vertices[i].data;
G.vertices[i].firstarc=NULL;
}
for(k=0;k<G.arcnum;++k){
cin>>v1>>v2;
j=LocalVex(G,v1);
j=LocateVex(G,v2);
}
}
区别:(1)对于任何一个确定的无向图,邻接矩阵是唯一的,但邻接表不唯一。
(2)链接矩阵的空间复杂度是O(n^2),而邻接表是O(n+e)。