图的定义
图G是由两个集合V和E组成,记为G=(V,E)
V(G)和E(G)表示图的顶点集和边集。其中E(G)可以为空, 表示这个图只有定点没有边
图的分类
有向图和无向图
其中第一个图就是无向图:G1=({V1,V2,V3,V4,V5},{(v1,v2),(v1,v3),(v2,v5)(v3,v5),(V4,V5)})
第二幅图就是有向图:G2=({V1,V2,V3,V4,V5},{<V1,V2>,<V1,V3>,<V3,V4>,<V4,V5>,<V5,V3>})
要注意的是,在有向图中,边集中的边需要用尖括号表示,在无向图中,边集需要用小括号表示。
图的基本术语
用n表示定点数,用e表示边的数目
(1)子图:在一个图中,一个图的顶点和边是另外一个图的顶点和边的子集,那么这个图就是原来的图的子图(类比数学中的子集的概念)
(2)无向完全图和有向完全图:对于无向图,如果边为n(n+1)/2,那么就是无向完全图
在有向图中,如果边n(n+1)——有向完全图
(3)稀疏图和稠密图:边很多的就是稠密图,相应的,少的就是稀疏图
(4)权和网:权这个跟数学中的相类似,网就是带权的图
(5)邻接点:两个点有同一个边。如果一条边e连接了两个顶点v和v1,那么我们可以称边e依附于顶点v和v1,或者说,边e和v和v1相关联
(6)度,入度和出度:很好理解不解释
但是要知道的是,入度和出度这种说法是对于有向图而言的,无向图中没有入度和出度这种说法。在有向图中,节点的度=入度+出度
(7)路径和路径长度
(8)回路或环
(9)简单路径,简单回路或简单环:顶点不重复出现的路径称为简单路径。
除了第一个和最后一个顶点以外,其他顶点都不重复出现的就是简单回路或简单环
(10)连通,连通图,连通分量:连通分量,就是无向图中的极大连通子图
极大连通子图,如果再增加一个顶点就是不连通的了
在上面中,我们会发现,图a有三个子图我们拆分成左边这样,b,c和d都是a的极大连通子图
(11)强连通图和强连通分量:(注意,强连通图和强连通分量都是相对于有向图而言的)
在有向图中,任意两个顶点之间都有路径——强连通图
在强连通图G中的极大强连通子图——强连通分量
(12)连通图的生成树:一个极小连通子图,包含图中的所有顶点,但是只有n-1条边(首先,一定是连通的)
注意:一棵有n个顶点的生成树有且仅有n-1条边
如果一个图有n个顶点或者小于n-1条边,那就是非连通图
如果他多于n-1条边,那一定有环
但是,有n-1条边的图不一定是生成树
(13)有向树和生成森林:有一个顶点入度是0,其余顶点的入度全部是1的有向图就是有向树,由若干颗有向树构成的不相交的就是生成森林。
(14)极小连通子图:如果再删除一条边就是不连通的了
(15)生成树:包含了无向图G的所有顶点的极小连通子图
图的存储结构
1.邻接矩阵表示法(数组表示法)
表示顶点之间相邻关系的矩阵。
如果两个顶点之间有边,就用1表示,如果没有就用0表示。
邻接矩阵一定是方阵
如果是一个网的话(边之间有权),那么如果两个顶点之间有边,就用边的权值表示,如果没有,就用无穷表示
建立一个顶点表(记录各个顶点的信息)和邻接矩阵(表示各个顶点之间的关系)
无向图的邻接矩阵表示:
分析:(1)无向图的邻接矩阵是对称的
(2)顶点i的度=第i行(列)中1的个数
(3)特别的,完全图中,对角线元素都是0,其余的都是1
有向图的邻接矩阵表示
注意:第i行表示以当前节点为弧尾的出度边
第i列表示以当前为节点的弧头的入度边
分析:(1)有向图的邻接矩阵可能不是对称的
(2)顶点的出度=第i行元素之和
顶点的入度=第i列的元素之和
顶点的度=第i行元素之和和第i列的元素之和
网的邻接矩阵表示
邻接矩阵
#define MaxInt 32767 //表示极大值,即无穷
#define MVNum 100 //最大顶点数
typedef char VerTexType //设顶点的数据类型为字符型
typedef int ArcType //假设边的权值类型为int型
typedef struct
{
VerTexType vexs[MVNum]; //顶点表
ArcType arcs[MVNum][MVNum]; //邻接矩阵
int vexnum,arcnum; //图的当前顶点数和边数
}AMGraph;
采用邻接矩阵法创建无向网
步骤:
(1)输入总顶点数和总边数
(2)依次输入顶点信息(初始化顶点表)
(3)将邻接矩阵全部元素初始化为无穷
(4)初始化邻接矩阵
Status creatUDN(AMGraph &G)
{
cin>>G.vexnum>>