6.1 图的基本概念
定义
线性表可以是空表,树可以是空树,但图不可以是空图,不能一个顶点都没有,图的顶点集 V V V一定非空,但边集 E E E可以为空。
有向图
若边集 E E E是有向边(弧)的有限集合时,则图 G G G为有向图。弧是顶点的有序对,记为 < v , w > <v,w> <v,w>,其中 v , w v,w v,w是顶点, v v v是弧尾, w w w是弧头, < v , w > <v,w> <v,w>称为顶点 v v v到顶点 w w w的弧,也称 v v v邻接到 w w w或 w w wl邻接自 v v v。
无向图
若边集 E E E是无向边(边)的有限集合时,则图 G G G为无向图。边是顶点的无序对,记为 ( v , w ) 或 ( w , v ) (v,w)或(w,v) (v,w)或(w,v),其中 v , w v,w v,w是顶点,可以说顶点 v v v和顶点 w w w互为邻接点。边 ( v , w ) (v,w) (v,w)依附于顶点 v , w v,w v,w或者说 ( v , w ) (v,w) (v,w)和 v , w v,w v,w相关联。
简单图
简单图 G G G满足:
①不存在重复边;
②不存在顶点到自身的边;
多重图
若图 G G G中两个结点之间的边数多余一条,又允许顶点通过同一条边与自己关联,则 G G G为多重图。多重图的定义和简单图相对。
完全图(简单完全图)
对无向图, ∣ E ∣ |E| ∣E∣的取值范围是 0 0 0到 n ( n − 1 ) / 2 n(n-1)/2 n(n−1)/2,有 n ( n − 1 ) / 2 n(n-1)/2 n(n−1)/2条边的无向图称为完全图,即图中任意两个顶点之间都存在边。
对有向图, ∣ E ∣ |E| ∣E∣的取值范围是 0 0 0到 n ( n − 1 ) n(n-1) n(n−1),有 n ( n − 1 ) n(n-1) n(n−1)条弧的有向图称为有向完全图,即图中任意两个顶点之间都存在方向相反的两条弧。
子图
设有两个图 G = ( V , E ) 和 G ′ = ( V ′ , E ′ ) G=(V,E)和G'=(V',E') G=(V,E)和G′=(V′,E′),若 V ′ V' V′是 V V V的子集,且 E ′ E' E′是 E E E的子集,则称 G ′ G' G′是 G G G的子图。若有满足 V ( G ′ ) = V ( G ) V(G')=V(G) V(G′)=V(G)的子图 G ′ G' G′,则称 G ′ G' G′为 G G G的生成子图。
并非V和E的任何子集都能构成G的子图。
连通、连通图和连通分量
在无向图中,若从顶点 v v v到顶点 w w w有路径存在,则称 v v v和 w w w是连通的。若图 G G G中任意两个顶点都是连通的,则称图 G G G为连通图,否则称为非连通图。**无向图中的极大连通子图称为连通分量。**若一个图有个 n n n个顶点,并且边数小于 n − 1 n-1 n−1,则此图必是非连通图。
*注意:弄清连通、连通图、连通分量的厩念非常重要。首先要区分极大连通子图和极小连通子图,极大连通子图是无向图的连通分量,极大即要求该连通子图包今其所有的边;极小连通子图是既要保持图连通又要使得边数最少的子图。
强连通图、强连通分量
在有向图中,若从顶点 v v v到顶点 w w w和从顶点 w w w到顶点 v v v之间都有路径,则称这两个顶点是强连通的。若图中任何一对顶点都是强连通的,则称此图为强连通图。有向图中的极大强连通子图称为有向图的强连通分量。
注意:强连通图、强连通分量不是针对有向图而言的一般在无向图中讨论连通性,在有向图中考虑强连通性。
生成树、生成森林
连通图的生成树是包含图中全部顶点的一个极小连通子图。若图中顶点数为 n n n,则它的生成
树含有 n − 1 n-1 n−1条边,对生成树而言,若砍去它的一条边,则会变成非连通图,若加上一条边则会形成一个回路。在非连通图中,连通分量的生成树构成了非连通图的生成森林。
顶点的度、入度和出度
图中每个顶点的度定义为以该顶点为一个端点的边的数目。
对于无向图,顶点 v v v的度是指依附于该顶点的边的条数,记为 T D ( v ) TD(v) TD(v).
在具有 n n n个顶点、 e e e条边的无向图中, ∑ i = 1 n T D ( v i ) = 2 e \sum_{i=1}^nTD(v_i)=2e ∑i=1nTD(vi)=2e,即无向图的全部顶点的度的和等于边数的2倍,因为每条边和两个顶点相关联。
对于有向图,顶点 v v v的度分为入度和出度,入度是以顶点 v v v为终点的有向边的数目,记为 I D ( v ) ID(v) ID(v);
而出度是以顶点 v v v为起点的有向边的数目,记为 O D ( v ) OD(v) OD(v).顶点 v v v的度等于其入度和出度之和,即 T D ( v ) = I D ( v ) + O D ( v ) TD(v)=ID(v)+OD(v) TD(v)=ID(v)+OD(v)。
在具有 n n n个顶点、 e e e条边的有向图中, ∑ i = 1 n I D ( v i ) = ∑ i = 1 n O D ( v i ) = e \sum_{i=1}^nID(v_i)=\sum_{i=1}^nOD(v_i)=e ∑i=1nID(vi)=∑i=1nOD(vi)=e,即有向图的全部顶点的入度之和与出度之和相等,并且等于边数。这是因为每条有向边都有一个起点和终点。
边的权和网
在一个图中,每条边都可以标上具有某种含义的数值,该敖值称为该边的权值,这种边上带有权值的图称为带权图,也称网。
稠图.稀疏图
边敖很少的图称为稀疏图,反之称为稠密图。稀疏和稠密本身是模糊的概念,稀琉图和稠密图常常是相对而言的。一般当图 G G G满足$|E|<|V|log|V|时,可以将G视为稀疏图。
路径、路径长度和回路
顶点 v p v_p vp到顶点 v q v_q vq与之间的一条路径是指项点序列 v p , v i 1 , v i 2 , . . . , v i m , v q ) v_p,v_{i_1},v_{i_2},...,v_{i_m},v_q) vp,vi1,vi2,...,vim,vq),当然关联的边也可以理解为路径的构成要素。路径上边的数目称为路径长度。第一个顶点和最后一个顶点相同的路径称为回路或环。在若一个图有 n n n个顶点。并且有大于 n − 1 n-1 n−1条边,则此图一定有环。
简单路径、简单回路
在路径序列中,顶点不重复出现的路径称为简单路径,除第一个顶点和最后一个顶点外,其余顶点不重复出现的回路称为简单回路。
距离
从顶点 u u u出发到顶点 v v v的最短路径若存在,则此路径的长度称为从 u u u到 v v v的距离。若从 u u u到 v v v根本不存在路径,则记该距离为无穷(∞).
有向树
一个顶点的入度为0,其余顶点的入度均为1的有向图,称为有向树。
习题6.1
选择题
- 无相连通图对应的生成树也是无相连通图,但此时边数等于顶点数减1。一个无向连通图的顶点恰好构成一个回路,此时每个顶点的度都是2。
- 给定一张图有n个顶点,要保证图在任何情况下都是连通的,当n-1个顶点构成一个完全无向图时,加上一条边,第n个顶点必然与此完全无向图构成一个连通图,所以最少边数为(n-1)(n-2)/2+1
- 若图的邻接矩阵为非对称矩阵,则图是有向图。
- m条边构成的非连通无向图,若该图是连通图,则最少有n-1个顶点,n(n-1)/2=m,求得n后再加1个顶点则变得不连通、
- 对于一个有n个顶点的图:若是连通无向图, 变最小即构成一棵树的情形,因此有n-1条边;对于强连通有向图,边最少即构成一个有向环的情形,最少为n条边。
- n个顶点的图是一个环,有n条边,去掉其中任意一条边都可以是一棵生成树,因此生成树有n种情况。
简答题
- 如何对无环有向图中的顶点号重新安排可使得该图的邻接矩阵中所有的1都集中到对角线以上。
按各顶点出度进行排序。n个顶点的有向图,其顶点的最大出度是n-1,最小出度是0。这样排序后,出度最大的顶点编号为1,出度最小的顶点编号为n。只要存在弧 < i , j > <i,j> <i,j>,就不管顶点 j j j出度是否大于顶点 i i i的出度,都把 i i i编号在 j j j的编号之前,以为只有 i ≤ j i≤j i≤j,弧 < i , j > <i,j> <i,j>对于的1才能出现在邻接矩阵的上三角。
6.2 图的存储和基本操作
邻接矩阵法
邻接矩阵的定义
结点数为 n n n的图 G = ( V , E ) G=(V,E) G=(V,E)的邻接矩阵A是一个 n x n nxn nxn的矩阵。
将 G G G的顶点编号为 v 1 , v 2 , . . . , v n v_1, v_2,...,v_n v1,v2,...,vn,
对于带权图而言,
#define MaxVertexNum 100
typedef char VertexType;
typedef int EdgeType;
typedef struct{
VertexType Vex[MaxVertexNum];
EdgeType Edge[MaxVertexNum][MaxVertexNum];
int vexnum, arcnum;
}MGraph;
邻接矩阵的特点
- 无向图的邻接矩阵一定是一个对称矩阵。因此实际存储邻接矩阵时只需存储上或下三角矩阵的元素。
- 用邻接矩阵存储图,计算图中有多少边所花费时间代价很大。
- 稠密图适合用邻接矩阵存储。
- 设图 G G G的邻接矩阵 A A A, A n A^n An的元素 A n [ i ] [ j ] A^n[i][j] An[i][j]等于由顶点 i i i到 j j j的长度为n的路径数目。
邻接表法
定义
邻接表由顶点表和边表组成,顶点表包含定点信息和指向第一条边结点的指针,边表包含另一顶点和指向该顶点下一条边的指针(可能还有权重)。
#define MaxVertexNum 100
typedef struct ArcNode{
//边表结点
int adjvex;
struct ArcNode *next;
//InfoType info; //网的边权值
}ArcNode;
typedef struct VNode{
//顶点表结点
VertexTyep data;
ArcNode *first;
}VNode, AdjList[MaxVertexNum];
typedef struct{
AdjList vertices; //邻接表
int vexnum, arcnum