目录
图
常用术语
有向图、无向图、完全图、有向完全图、稀疏图、稠密图、网、邻接点、路径、简单路径、回路或环、简单回路、连通、连通图、强连通图、生成树
基本术语
在图中的数据元素通常称为顶点,图G(Graph)是由顶点集合V(vertex)及顶点之间的关系集合E(Edge)(称为边或弧)组成的一种数据结构。记为G=(V,E)。
1.无向边
如果顶点vi和vj间的边没有方向,则称该边为无向边,用无序偶对表示:(vi,vj)
2.有向边
如果顶点vi和vj间的边有方向,则称该边为有向边,用有序偶对表示:<vi,vj>
3.无向图
在一个图G中,任意两个顶点构成的偶对(vi,vj)∈E都是无序的,则称该图为无向图
4.有向图
在一个图G中,任意两个顶点构成的偶对(vi,vj)∈E都是有序的,则称该图为有向图
5.弧头、弧尾
<vi,vj>,vi称为初始点(弧尾Tail),vj称为终端点(或弧头Head)。
6.权、网
边或者弧上的数据信息称为边的权
带权的图称为网
7.完全图
1.无向图中任意两个顶点间都存在边,则称之为无向完全图,边数为n(n-1)/2
2.有向图中任意两个顶点间都存在方向互为相反的两条弧,则称之为有向完全图,边数为n(n-1)
8.稠密图、稀疏图
1.当一个图接近完全图时,称之为稠密图
2.当一个图中含有较少的边或弧时,则称之为稀疏图
9.子图
有两个图G1=(V1,E1)和G2=(V2,E2),满足V2⊆V1,E2⊆E1,则G2是G1的子图
10.邻接点和度
1.无向图
a.假若顶点v 和顶点w之间存在一条边,则称顶点v 和w互为邻接点
b.顶点v关联的边的数目定义为v的度
2.有向图
由于弧有方向性,则有入度和出度之分
a.顶点的出度是以顶点v为弧尾的弧的数目
b.顶点的入度是以顶点v为弧头的弧的数目
顶点的度=顶点的出度+顶点的入度
11.路径、路径长度
1.路径是指从顶点vi到顶点vj之间所经历的顶点序列
2.路径的长度是路径上的边或弧的数目
12.简单路径、回路、简单回路
1.顶点不重复出现的路径,称为简单路径
2.顶点序列中第一个顶点和最后一个顶点相同
3.若顶点序列中除第一个顶点和最后一个顶点相同外,其余顶点不重复,则称该回路为简单回路或者简单环
13.连通图、连通分量
1.无向图图中任意两个顶点vi、vj∈V,vi和vj都是连通的,则称图G为连通图
2.无向图连通图的连通分量是它本身
2.无向图非连通图的连通分量可能为多个
14.强连通图、强连通分量
1.若有向图中任意两个顶点之间都存在两条互为反方向的路径,即从vi到vj及从vj到vi都有路径,则称此有向图为强连通图
2.有向图中的极大连通子图称作该有向图的强连通分量
15.生成树
连通图G的生成树,是包含G的全部n个顶点的一个极小连通子图,该极小连通子图有(n-1)条边
16.生成森林
1.如果一个有向图有且仅有一个顶点的入度为0,其他顶点的入度均为1,则这个图是一棵有向树。
2.当一个有向图有多个顶点的入度为0时,它的生成森林则由多棵有向树构成。这个生成森林含有图中全部的顶点和相应的弧。
图的存储与操作
邻接矩阵
用两个数组来表示图,一个数组是一维数组,存储图中顶点的信息,另一个数组是二维数组,即矩阵,存储顶点之间相邻的信息,也就是边(或弧)的信息,这是邻接矩阵名称的由来
邻接表
图的遍历
从图中的任意顶点出发,访问其余顶点,并且保证所有顶点都被访问且只被访问一次,称此过程为图的遍历
深度优先遍历算法(类似树的先序遍历)
广度优先遍历算法(类似树的层次遍历)
从顶点V 出发的广度优先搜索遍历序列可能有多种,这里只给出其中的三种,其它的可类似分析。这三种广度优先搜索遍历序列为:
V,W1,W 2,W8,W7,W3,W5,W6,W4
V,W2,W 8,W1,W3,W5,W7,W4,W6
V,W1,W 8,W2,W7,W3,W5,W6,W4
图与最小生成树
生成树
在一个有n个顶点的连通图G中,存在一个极小的连通子图G’ ,G’包含图G的所有顶点,但只有n-1条边,并且G’是连通的,称G’为G的生成树
由深度优先搜索得到的生成树称为深度优先生成树
广度优先生成树称为广度优先搜索得到的生成树
生成森林
若一个图是非连通图或非强连通图,但有若干个连通分量或若干个强连通分量,则通过深度优先搜索遍历或广度优先搜索遍历,不能得到生成树,但可以得到生成森林
最小生成树
边的权值总和最小的生成树,称为最小代价生成树
1. 必须只使用该网中的边来构造最小生成树
2.必须使用且仅使用n-1条边来连接网中的n个顶点
3.不能使用产生回路的边
普里姆算法(Prim)
普里姆算法是从最小生成树中顶点的角度出发来考虑的,因为图中有n个顶点,按照生成树的定义,所有的顶点都必须加入到最小生成树中,所以除去最初选定的顶点,剩余的n-1个顶点在加入到最小生成树的过程中可以选择n-1条边加入到最小生成树的边集中
克鲁斯卡尔算法(Kruskal)
克鲁斯卡尔算法考虑问题的出发点是为使生成树上边的权值之和达到最小,则应使生成树中每一条边的权值尽可能地小。具体做法是先构造一个只含n个顶点的子图G’ ,然后从权值最小的边开始,若它的添加不使G’中产生回路,则在G’上加上这条边,如此重复,直至加上n-1条边为止
最短路径
单源点最短路径的定义
1.在网图中,求点A到点B的所有路径中,边的权值之和最短的那一条路径。这条路径就是两点之间的最短路径,并称路径上的第一个顶点为起点,最后一个顶点为终点
2.最短路径问题是图的一个比较典型的应用问题。而单源点最短路径是其中比较重的一个应用
3.设有向图G=(V,E)。以某指定顶点为源点,求从出发到图中其余各点的最短路径称为单源最短路径
迪杰斯特拉算法