1.图的定义,概念、术语及基本操作
1)图的定义
图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成;
通常表示为:G(V,E),G表示一个图,V是图G中顶点的集合,E是图G中边的集合;
注意:在图中数据元素称之为顶点(Vertex),而且顶点集合有穷非空;在图中任意两个顶点之间都可能有关系,顶点之间的逻辑关系用边来表示。
2)图的分类
按照有无方向,分为无向图和有向图;
无向图:如果图中任意两个顶点之间的边都是无向边,则称该图为无向图。
无向边:若顶点M到顶点N的边没有方向,称这条边为无向边,用无序偶对(M,N)或(N,M)表示。
无向图是有边和顶点构成。如下图所示就是一个无向图G1:
无向图G1= (V1,{E1}),其中顶点集合 V1={A,B,C,D};边集合E1={(A,B),(B,C),(C,D),(D,A)}
有向图:如果图中任意两个顶点之间的边都是有向边,则称该图为有向图。
有向边:若顶点M到顶点N的边有方向,称这条边为有向边,也称为弧,用偶序对 < M, N >表示;M表示弧尾,N表示弧头
有向图是有弧和顶点构成,如下图所示是一个有向图G2:
有向图G2=(V2,{E2}),其中顶点集合 V2={A,B,C,D};弧集合E2={< A,D>,< B,A>,< C,A>,< B,C>}
对于弧< A,D>来说, A是弧尾,D是弧头
注意:无向边用 小括号 “()”表示,有向边用“<>”表示。
无向完全图:在无向图中,如果任意两个顶点之间都存在边,则称该图为无向完全图。
含有n个顶点的无向完全图有n * (n-1)/2条边。下面是一个无向完全图
4个顶点,6条无向边,每个顶点对应3条边 ,一共4个顶点 总共 4*3,每个顶点对应的边都重复计算了一次,所以整体要除以2。
对于n各 顶点和e条边的无向图满足:0<=e <= n(n-1)/2
有向完全图:在有向图中,如果任意两个顶点之间都存在方向互为相反的两条弧,则称该图为有向完全图。
含有n个顶点的无向完全图有n * (n-1)条边。下面是一个有向完全图
4个顶点,12条弧,一共4个顶点 总共 4*3。
2,按照弧或边的多少,分为稀疏图和稠密图;
若边或弧的个数e<=NlogN(N是顶点的个数),称为系数图,否则称为稠密图;
3,按照边或弧是否带权,其中带权的图统称为网
有些图的边或弧具有与它相关的数字,这种与图的边或弧相关的数叫做权。
有向网中弧带权的图叫做有向网;
无向网中边带权的图叫做无向网;
比如下图就是一个无向图
图的顶点和边间关系
邻接点 度 入度 出度
对于无向图,假若顶点v和顶点w之间存在一条边,则称顶点v和顶点w互为邻接点,边(v,w)和顶点v和w相关联。
顶点v的度是和v相关联的边的数目,记为TD(v);
上面这个无向图G1,A和B互为邻接点,A和D互为邻接点,B和C互为邻接点,C和D互为邻接点;
A的度是2,B的度是2,C的度是2,D的度是2;所有顶点度的和为8,而边的数目是4;
图中边的数目e = 各个顶点度数和的一半。
对于有向图来说,与某个顶点相关联的弧的数目称为度(TD);以某个顶点v为弧尾的弧的数目定义为顶点v的出度(OD);以顶点v为弧头的弧的数目定义为顶点的入度(ID)
度(TD) = 出度(OD) + 入度(ID);
比如上面有向图,
A的度为3 ,A的入度 2,A的出度是1
B的度为2 ,B的入度 0,B的出度是2
C的度为2 ,C的入度 1,C的出度是1
D的度为1 ,D的入度 1,D的出度是0
所有顶点的入度和是4,出度和也是4,而这个图有4个弧
所以 有向图的弧 e = 所有顶点入度的和 = 所有顶点出度的和
路径 路径长度 简单路径 回路 (环) 简单回路(简单环)
设图G=(V,{E})中的一个顶点序列{u=Fi0,Fi1,Fi2,….Fim=w}中,(Fi,j-1,Fi,j)∈E 1 ≤j ≤m,则称从顶点u到顶点w之间存在一条路径,路径上边或弧的数目称作路径长度,
若路径中的顶点不重复出现的路径称为简单路径
若路径中第一个顶点到最后一个顶点相同的路径称为回路或环
若路径中第一个顶点和最后一个顶点之外,其余顶点不重复出现的回路,称为简单回路或简单环
比如下图 :
从B 到 D 中顶点没有重复出现 ,所以是简单路径 ,边的数目是2,所以路径长度为 2。
图1和图2都是一个回路(环),图1中出了第一个顶点和最后一个顶点相同之外,其余顶点不相同,所以是简单环(简单回路),图2,有与顶点C重复就不是一个简单环了;
连通图相关术语
连通图
在无向图G(V,{E})中,如果从顶点V到顶点W有路径,则称V和W是连通的。如果对于图中任意两个顶点Vi、Vj∈V,Vi和Vj都是连通的,则称G是连通图。
如下图所示:
图1,顶点A到顶点E就无法连通,所以图1不是连通;图2,图3,图4属于连通图;
连通分量
若无向图为非连通图,则图中各个极大连通子图称作此图的连通分量;
图1是无向非连通图,由两个连通分量,分别是图2和图3。图4尽管也是图1的子图,但是它不满足极大连通,也就说极大连通应当是包含ABCD四个顶点,比如图2那样;
强连通图
在有向图G(V,{E})中,如果对于每一对Vi ,Vj∈V,Vi≠Vj,从Vi到Vj和从Vj到Vi都存在有向路径,则称G是强连通图。
图1不是强连通图因为D到A不存在路径,图2属于强连通图。
强连通分量
若有向图不是强连通图,则图中各个极大强连通子图称作此图的强连通分量;
图1不是强连通图,但是图2是图1的强连通子图,也就是强连通分量;
生成树和生成森林
生成树
假设一个连通图有n个顶点和e条边,其中n-1条边和n个顶点构成一个极小连通子图,称该极小连通子图为此连通图的生成树;
图1是一个连通图含有4个顶点和4条边,图2,图3,图4含有3条边和4个顶点,构成了一个极小连通图子图,也称为生成树,为什么是极小连通子图,因为图2,图3,图4中少一条边都构不成一个连通图,多一条边就变成一个回路(环),所以是3条边和4个顶点构成的极小连通子图。图5尽管也是3个边4个顶点,但不是连通图。
生成森林
如果一个有向图恰有一个顶点的入度为0,其余顶点的入度为1,则是一颗有向树;
入度为0,相当于根节点,入度为1,相当于分支节点;,比如下面的有向图就是一个有向树
顶点B的入度是0,其余顶点的入度是1;
一个有向图的生成森林由若干颗有向树组成,含有图中全部顶点,但有足以构成若干颗不相交的有向树的弧;
有向图1去掉一些弧后分解成2颗有向树,图2和图3,这两颗树就是有向图图1的生成森林;
2.图的存储结构
1).邻接矩阵(数组)表示法
① 建立一个顶点表和一个邻接矩阵
② 设图 A = (V, E) 有 n 个顶点,则图的邻接矩阵是一个二维数组 A.Edge[n][n]。
注:在有向图的邻接矩阵中,
第i行含义:以结点vi为尾的弧(即出度边);
第i列含义:以结点vi为头的弧(即入度边)。
邻接矩阵法优点:容易实现图的操作,如:求某顶点的度、判断顶点之间是否有边(弧)、找顶点的邻接点等等。
邻接矩阵法缺点:n个顶点需要n*n个单元存储边(弧);空间效率为O(n^2)。
2).邻接表(链式)表示法
① 对每个顶点vi 建立一个单链表,把与vi有关联的边的信息(即度或出度边)链接起来,表中每个结点都设为3个域:
② 每个单链表还应当附设一个头结点(设为2个域),存vi信息;
③ 每个单链表的头结点另外用顺序存储结构存储。
邻接表的优点:空间效率高;容易寻找顶点的邻接点;
邻接表的缺点:判断两顶点间是否有边或弧,需搜索两结点对应的单链表,没有邻接矩阵方便。
3.图的遍历
遍历定义:从已给的连通图中某一顶点出发,沿着一些边,访遍图中所有的顶点,且使每个顶点仅被访问一次,就叫做图的遍历,它是图的基本运算。
图的遍历算法求解图的连通性问题、拓扑排序和求关键路径等算法的基础。
图常用的遍历:一、深度优先搜索;二、广度优先搜索
深度优先搜索(遍历)步骤:(如下图)
① 访问起始点 v;
② 若v的第1个邻接点没访问过,深度遍历此邻接点;
③ 若当前邻接点已访问过,再找v的第2个邻接点重新遍历。
基本思想:——仿树的先序遍历过程。
遍历结果:v1->v2->v4->v8->v5-v3->v6->v7
广度优先搜索(遍历)步骤:
① 在访问了起始点v之后,依次访问 v的邻接点;
② 然后再依次(顺序)访问这些点(下一层)中未被访问过的邻接点;
③ 直到所有顶点都被访问过为止。
遍历结果:v1->v2->v3->v4->v5-v6->v7->v8
4.图的连通性问题
1)对无向图进行遍历时,对于连通图,仅需从图中任一顶点出发,进行深度优先搜索或广度优先搜索,便可访问到图中所有顶点。
2)最小生成树:在连通网的所有生成树中,所有边的代价和最小的生成树。
构造最小生成树有很多算法,但是他们都是利用了最小生成树的同一种性质:MST性质(假设N=(V,{E})是一个连通网,U是顶点集V的一个非空子集,如果(u,v)是一条具有最小权值的边,其中u属于U,v属于V-U,则必定存在一颗包含边(u,v)的最小生成树),下面就介绍两种使用MST性质生成最小生成树的算法:普里姆算法和克鲁斯卡尔算法。
Kruskal算法特点:将边归并,适于求稀疏网的最小生成树。
Prime算法特点: 将顶点归并,与边数无关,适于稠密网。
Prime算法构造最小生成树过程如下图:
Kruskal算法构造最小生成树过程如下图:
5.有向无环图及其应用
有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。
1)拓扑排序
拓扑排序对应施工的流程图具有特别重要的作用,它可以决定哪些子工程必须要先执行,哪些子工程要在某些工程执行后才可以执行。
我们把顶点表示活动、边表示活动间先后关系的有向图称做顶点活动网(Activity On Vertex network),简称AOV网。
一个AOV网应该是一个有向无环图,即不应该带有回路,因为若带有回路,则回路上的所有活动都无法进行(对于数据流来说就是死循环)。在AOV网中,若不存在回路,则所有活动可排列成一个线性序列,使得每个活动的所有前驱活动都排在该活动的前面,我们把此序列叫做拓扑序列(Topological order),由AOV网构造拓扑序列的过程叫做拓扑排序(Topological sort)。AOV网的拓扑序列不是唯一的,满足上述定义的任一线性序列都称作它的拓扑序列。
拓扑排序的实现:
a.在有向图中选一个没有前驱的顶点并且输出
b.从图中删除该顶点和所有以它为尾的弧(白话就是:删除所有和它有关的边)
c.重复上述两步,直至所有顶点输出,或者当前图中不存在无前驱的顶点为止,后者代表我们的有向图是有环的,因此,也可以通过拓扑排序来判断一个图是否有环。
2)关键路径
AOE-网是一个带权的有向无环图,其中,顶点表示事件,弧表示活动,权表示活动持续的时间。通常,AOE-网可用来估算工程的完成时间。
关键路径:在AOE网中,从始点到终点具有最大路径长度(该路径上的各个活动所持续的时间之和)的路径称为关键路径。
关键活动:关键路径上的活动称为关键活动。关键活动:e[i]=l[i]的活动
由于AOE网中的某些活动能够同时进行,故完成整个工程所必须花费的时间应该为始点到终点的最大路径长度。关键路径长度是整个工程所需的最短工期。
与关键活动有关的量:
(1)事件的最早发生时间ve[k]:ve[k]是指从始点开始到顶点vk的最大路径长度。这个长度决定了所有从顶点vk发出的活动能够开工的最早时间。
(2)事件的最迟发生时间vl[k]:vl[k]是指在不推迟整个工期的前提下,事件vk允许的最晚发生时间。
(3)活动的最早开始时间e[i]:若活动ai是由弧<vk , vj>表示,则活动ai的最早开始时间应等于事件vk的最早发生时间。因此,有:e[i]=ve[k]
(4)活动的最晚开始时间l[i]:活动ai的最晚开始时间是指,在不推迟整个工期的前提下, ai必须开始的最晚时间。若ai由弧<vk,vj>表示,则ai的最晚开始时间要保证事件vj的最迟发生时间不拖后。因此,有:l[i]=vl[j]-len<vk,vj>
示例如下:
6.最短路径
从某顶点出发,沿图的边到达另一顶点所经过的路径中,各边上权值之和最小的一条路径叫做最短路径。
1)迪杰斯塔拉算法--单源最短路径
所有顶点间的最短路径—用Floyd(弗洛伊德)算法