第一章 图的基本概念和图的存储
本篇是学习《图论算法理论,实现及应用》的学习笔记的第一章,概念部分
1.1图的基本概念
1图是由定点集合和顶点之间的二元关系集合(即边的集合或者弧的集合)组成的数据结构,通常用G(V,E)表示。
顶点集合(Vertex Set):V(G) 边的集合(Edge Set): E(G)
V(G)中的元素称为顶点(vertex),顶点的个数称为图的阶(Order),用n表示
E(G)中的元素称为边(Edge):,边的个数称为图的边数,用m表示。
(u,v):表示无向边u和v相关联
无向图:图中的所有边没有方向。E(u,v)
有向图:图中的所有边都有方向。E<u,v> :表示从顶点u指向顶点v的一条有向边。
U是起点,v是终点
有向图的边(Edge)也称为弧(Arc),有向图也可以表示为D(V,A):其中A为弧的集合
有向图的基图:忽略有向图所有边的方向,得到的无向图就是该有向图的基图
说明:如果一个图中某些边具有方向性,而其他边没有方向性,这种图可以称为混合图。
1.2完全图,稀疏图,稠密图
完全图:
定义:如果无向图中任何两个顶点之间都有一条边,这种无向图,称为完全图。
性质:阶数和边数的关系 m = n * (n-1) / 2;
表示:阶为n的完全图用Kn表示。
有向完全图:
定义:若果有向图中任何一对顶点u和v,都存在<u,v>和<v,u>两条有向边,这种有向图称为有向完全图。
性质:阶数和边数的关系 m = n*(n-1);
稀疏图:边或者弧的数目相对较小(远小于 n * (n-1) )的图称为稀疏图,或者说边或弧的数目 m < nlog(n)的无向图或者有向图,称为稀疏图,
稠密图:边或者弧的数目相对较多的图(接近于完全图或者有向完全图)称为稠密图。
平凡图:只有一个顶点的图,即阶 n = 1的图称为平凡图,当n > 1的图称为非平凡图。
零图:边的集合E(G)为空的图,称为零图。
1.3顶点与顶点顶点与边的关系
说明:在无向图和有向图中,顶点与顶点之间的关系,以及顶点与边的关系是通过“邻接(Adjacency)”这个概念表示的,
在无向图G(V,E) 如果(u,v)是E(G)中的元素,即(u,v)是图中的一条无向边,则成顶点u和顶点v互为邻接顶点,边(u,v)依附于顶点u和顶点v.,或称边(u,v)与顶点u或v相关联,此外称有一个工图顶点的两条不同边称为邻接边。
在有向图G(V,E)中,如果<u,v>是E(G)中的元素,即<u,v>是图中的一条有向边,则称顶点u邻接到顶点v,顶点v邻接子顶点u,边<u,v>与顶点u和顶点v相关联。
1.4顶点的度数和度的序列
顶点的度数:一个顶点的度数是与它相关联的边的数目,记做deg(u).
在有向图中,顶点的度数等于该顶点的出度与入度之和。
顶点u的出度:是以u为起始点的有向边,(就是从顶点u出发的边)的数目,记做od(u)
顶点u的入度:是以u为终点的有向边(就是进入到顶点u的有向边)的数目,记做id(u).
顶点u的度数:deg(u) = od(u) + id(u);
定理 1 : 在无向图和有向图中,所有顶点度数总和都存在如下关系
M = 1/2{Ʃdeg(Ui) }
说明:不管是有向图还是无向图,在统计所有顶点度数总和时,每条边都统计了两次。
偶点与奇点:把度数为偶数的顶点称为偶点,把度数为奇数的顶点称为奇点。
推论:每个图都有偶数个奇点。
孤立顶点: 度数为零的顶点,称为孤立顶点,孤立定点不与其他任何顶点邻接。
叶(Leaf):度数为1的顶点,称为叶。也称为叶顶点,或端点,其他顶点称为非叶顶点。
图G的最大度(Maximum Degree):图G所有顶点的最小的度数,记为δ(G)
图G的最小度(MiniMum Degree): 图G所有顶点的最小的度数,记为△(G)
1.5度序列与Havel-Hakimi定理
度序列:如果把图G所有顶点的度数排成一个序列s,则成为图G的度序列。
应用:用Havel-Hakimi定理可以判定一个图是否是可图化的。
可以根据该定理将s序列按照非递增序列排序后,进行图化然后构造图。在构造的过程中出现负数则不能构造图,则该图不可图化。
例子1:
序列S : 7,7,4,3,3,3,2,1
删除首项7 然后往后面数七位每位减一
得到:6,3,2,2,2,1,0
删除首项6然后往后面数六位每位减一
得到:2,1,1,1,0,-1
此时出现负数了,则该序列不可图化
例子2
序列s:5,4,3,3,3,2,2,2,1,1,1
删除首项5,然后往后面数5位每位减一
得到:3,2,2,1,1,2,1,1,1重新排序得到
3,2,2,2,1,1,1,1,1
继续删除首项3,然后往后面数3位每位减一
得到1,1,1,1,1,1,1,1,
依次可以得到
1,1,1,1,1,1,0
1,1,1,1,0,0
1,10,0,0
0,0,0,0
1.6二部图与完全二部图
二部图:设无向图为G(V,E),它的顶点集合V包含两个没有公共元素的子集,
X= {x1,x2,x3,x4.......}, Y={y1,y2,y3,y4,y5.......}
元素个数分别是s和t,,并且xi与xj(1<=i,j<=s),yi与yj(1<=i,j<=t)没有边连接,则称G为二部图,也称为二分图
完全二分图:在二部图中如果顶点集合X中每个顶点xi与顶点集合Y中每个顶点yl都有边相连,则称G为完全二部图
记为Ks,t s和t分别为集合X和集合Y中的顶点个数,在完全二部图中Ks,t中共有s*t条边
完全二部图边数公式 : Count(Ks,t) = s*t;
二部图的判定定理:
一个无向图G是二部图当且仅当G中无奇数长度的回路;
图的同构:(彼得松图)
设有两个图G1和G2,如果这两个图的区别仅在于图的画法与(或)顶点的标号方式,则称它们是同构的。
查阅图的同构定义。
1.7 子图与生成树
子图:设有两个图G(V,E)和G’(V’,E’)如果V’属于V,且E’属于E,则图G’是图G的子图。
生成树:一个无向连通图的生成树是它的包含所有顶点的极小连通子图,极小指的是边的数目极。
注: 如果图中有n个顶点,则生成树有n-1条边,
一个无向连通图可能有多个生成树。
子图
这里讨论两种子图的形式
一:顶点诱导子图
设图G’(V’,E’)是图G(V,E)的子图,且对于V’中的任意两个顶点u和v,只要(u,v)是G中的边,则一定是G’中的边,此时这样的子图既是顶点诱导子图。记为G[V’]
因为顶点是在G’中选的,如果G’中的边在G中存在那么就可以形成由顶点连成的子图了
二:边诱导子图
以E’作为边集,以至少与E’中一条边关联的那些顶点构成顶点边集V’,这个子图G’(V’,E’)称为是G的一个边诱导子图。记为G[E’];
说明:边必须依附于顶点才能存在。
1.8路径(Path)
定义:在图G(V,E)中,如果从顶点vi出发,沿着一些边经过一些顶点Vp1,Vp2,,,,,vpm,到达顶点vj,则称顶点序列(vi,vp1,vp2,vp3,,,,vpm,vj)为顶点vi到顶点vj的一条路径,也叫通路。
路径的长度(Length):路径中边的数目通常称为路径的长度。
简单路径 (simple Path ):如果路径上的vi,vp1,vp2,,,,vpm互相不重复,则这样的路径称为简单路径。
回路(circuit):如果路径上第一个顶点vi与最后一个顶点vj重合,则称这样的路径为回路。回路也称为环(Loop);
简单回路(simple circuit):除第一个和最后一个顶点外,没有顶点重复的回路称为简单回路。简单回路也称为圈(Cycle)
奇圈:路径长度为奇数的圈称为奇圈。
偶圈:路径长度为偶数的圈称为偶圈。
1.9连通性
连通:在无向图中,如果顶点v到顶点u有路径,则顶点v和顶点u是连通的。
连通图
定义:无向图中任意一一对顶点都是连通的,则称此图是连通图。
否则为非连通图。
连通分量:无向图不是连通图的情况下,其极大连通子图称为连通分量。这里说的极大只得是子图中包含的顶点个数极大。
在有向图中的连通性
强连通图:在有向图中,若果对每一对顶点u和v,既存在从u到v的路径,也存在从v到u的路径,则称此有向图为强连通图。
对于非强连通图,其极大强连通子图称为强连通分量。
注意:在有向图和无向图中的子图中连通分量就是子图。
2.0权值,有向网,无向网
权值(weight):某些图的边具有与它相关的数,称为权值。
权值的意义:这些权值可以表示从一个顶点到另一个顶点的距离,花费的代价,所需的时间。
网络:一个图的所有边都具有权值,称为加权图,也叫网络。
根据网络中的边是否有方向性,又可以分为有向网,无向网。
1.2图的存储表示
图的存储表示有很多种,比较常用的有三种:
邻接矩阵,邻接表,邻接多重表
1.2.1邻接矩阵的表示方式
有向图和无向图的邻接矩阵
邻接矩阵存储方法需要一个记录顶点信息的数组,还需要有一个记录各个顶点间的关系的矩阵,这个矩阵称为邻接矩阵。
使用 Edge[i][j] = 1<i,j>属于E或者(i,j)属于E
0 否则
一般邻接矩阵在计算机语言中使用二维数组表示。顶点信息数组一般使用一维数组表示。
在无向图中的邻接矩阵是沿对角线对称的,而有向图中的邻接矩阵不一定是沿对角线对称的。
无法用邻接矩阵表示的情况,或者说其局限性:如果图中存在自身的环(就是连接自己的边),或者重边(存在多条边起点一样,终点也一样),称为平行边
邻接矩阵所体现的信息
对于无向图: 如果Edge[i][j] = 1则表示顶点i和顶点j之间有一条边。
因此,邻接矩阵Edge第i行所有元素中元素值为1的个数表示顶点i的度数,第i列所有元素值为1的个数也表示顶点i的度数。
对于有向图:如果Edge[i][j] = 1,则表示存在从顶点i到顶点j有一条有向边,i是起点,j是终点,因此,在有向图的邻接矩阵中Edge第i行所有元素中元素值为1的个数表示顶点i的出度,第i列所有元素值为1的个数表示顶点i的入度。
1.2.2有向网和无向网的邻接矩阵
Edge[i][j] = | W(i,j) | 若果 i!=j,且<i,j> ∈E 或者 (i,j)∈E |
∞ | 如果 i!=j,且<i,j> 不属于E或者(i,j)不属于E | |
0 | 对角线上的位置,即 i = j |
说明1:在编程实现中,可以用一个比较大的常量表示无穷大∞;
说明2:在ACM/ICPC的比赛中,为了处理方便可以将有向网或无向网的邻接矩阵中对角线元素也定义成+∞;
说明3:在求解ACM/ICPC的题目时,可以采用邻接矩阵存储图,但由于邻接矩阵无法存储带自身的环或重边,的图,所以有时不得不采用邻接表来存储图。
另外当图的边数(相对于邻接矩阵中元素的个数即n*n)较少时,使用邻接矩阵存储会浪费较多的存储空间,而使用邻接表存储可以节省存储空间。
邻接表:就是把从同一个顶点发出的边连接在同一个称为边链表的单链表中。
边链表的每个节点代表一条边,称为边节点。
每个边节点有两个域:该边终结点的序号,还有一个指向下一个边节点的指针。
在邻接表中,还需要一个用于存储顶点信息的顶点数组。
出边表:在邻接表中的每个顶点的边链表,各边结点所表示的边都是从该顶点出发的边,称为出边表。
入边表(逆邻接表):进入同一个顶点的边链接在同一个边链表。
说明4:如果用邻接表存储有向网或无向网,则在边结点中还应增加一个成员,用于存储边的权值。
1.2.3关于邻接矩阵和邻接表的进一步讨论。
1.存储方式对算法复杂度的影响
存储方式的选择对图论算法的的时间复杂度和空间复杂度有直接影响。(假设图中有n个顶点,m条边)
时间复杂度:邻接表中直接存储了边的信息,浏览完所有的边,对有向图来说时间复杂度为O(m).对无向图时间复杂度是O(2*m),而邻接矩阵是间接存储边,浏览完所有的边,复杂度是O(n*n);
空间复杂度:邻接表里除了存储m条边所对应的边结点外,还需要一个顶点数组,粗成你各个定的信息以及各边链表的表头指针,总的空间复杂度为O(n+m)(或O(n+2*m)),而用邻接矩阵存储图需要n*n规模的存储单元,其空间复杂度为O(n*n),当边的数目相对较小时,邻接矩阵里存储了较多的无用信息,用邻接表可以节省较多的存储空间。
2.在求解问题事可以灵活的存储表示图
当图中顶点个数确定以后(这里假设顶点序号是连续的),图的结构就唯一地取决于边的信息,因此可以把每条边的信息(起点,终点,边的权值等)存储到一个数组里,在针对该图进行某种处理时,只需要访问边的数组中每个元素即可,在4.2节中的Bellman-Ford算法。可以使用这种存储方式实现。