一、图的定义:
1、基本定义
一个图G=(V,E)由顶点集V 和 边集E组成 ,G表示图,V表示图中顶点的集合,E表示图中边的集合
图中的数据元素为 顶点(vertex),并且不允许有空图即图中必须要有顶点
每一个点对(v,w),其中v w属于V。无向图中称为边;有向图中称为弧,表示变成<v,w>;即无向图边用圆括号()表示,有向图边用尖括号<>表示
有时候边还有第三种成分,称作权值
简单图:在图中不存在顶点到其自身的图,且同一条边不重复出现,则称这样的图为简单图
无向完全图:在无向图中,如果任意两个顶点之间都存在边,则称该图为无向完全图 含有n个顶点的无向完全图边条数为n(n-1)/2
有向完全图:在有向图中,如果任意两个顶点之间都存在方向互为相反的的两条弧,则该图为有向完全图 含有n个顶点的有向完全图弧个数n(n-1)
稀疏图:
稠密图:
网:带权值的图通常称作网
子图:
2、图的顶点与边间的关系
顶点v的度:是和v相关联的边的数目 入度:以顶点v为头的弧的数目称为入度 出度:以顶点v为尾的弧的数目称为出度
无向图中从顶点v到v'的路径是一个顶点的序列,路径长度是路径上的边或弧的数目
第一个顶点到最后一个顶点相同的路径称为回路或者环,序列中顶点不重复出现的路径称为简单路径
除第一个顶点和最后一个顶点外,序列中顶点不重复出现的回路称为简单回路或者简单环
3、连通图相关术语
连通图:两个顶点有路径,称两顶点连通,任意两个顶点都是连通的,则该图为连通图。
如果顶点v到顶点v'有路径,则称v和v'是连通的
无向图中的极大连通子图称为连通分量,强调以下几点:
(1)、要是子图 (2)、子图要是连通的(3)、连通子图含有极大顶点数(4)、具有极大顶点数的子图包含这些顶点的所有边
有向图中的强连通图:有向图G中,对于每一对vi,vj属于V,且vi 不等于vj,从vi到vj和从vj到vi都存在路径,则称G为强连通图
有向图中的极大强连通子图称作称作有向图的强连通分量
连通图的生成树:连通图生成树是一个极小连通子图,含有图中n个顶点,但只有足以构成树的n-1条边
有向树:若一个有向图恰有一个顶点的入度为0(相当于根结点),其余顶点入度为1(非根结点的双亲只有一个),则是一棵有向树
有向图生成森林:若干棵有向树组 构成
4、图的存储结构
(1)邻接矩阵
邻接矩阵存储方式:用两个数组来表示图,一个一维数组来存储顶点信息,一个二维数组( 邻接矩阵 )存储图中的边或者弧
假设图G中含有n个顶点,则邻接矩阵是一个nXn的方阵,定义为:
.......................
(2)邻接表
邻接矩阵虽然是一种不错的图存储结构,但是如果是稀疏图,那么就是对存储空间的极大浪费
因此引出图的第二种存储结构,邻接表
邻接表:链表与数组相结合的存储方法称为邻接表
图中顶点用一维数组来存储
(3)十字链表法
对于有向图来说,邻接表是有缺陷的,因为如果你关心了出度问题,想了解入度就必须遍历整个图才能知道,反之关心了入度问题,出度也必须要遍历整个图
有向图一种有效的存储方法,十字链表:把邻接表和逆邻接表结合起来
(4)邻接多重表
对于无向图来说,如果关注边的操作(例如边的删除),也需要对邻接表进行改造
删除边非常的方便
(5)边集数组
定义:两个一维数组构成,一个一维数组存储顶点信息,一个一维数组存储边的信息,边数组每个数据元素由一条边的起点、终点、权值组成
边集数组关心的是边的操作,查找某个顶点的度需要遍历整个数组,因此不适合对顶点的相关操作
二、图的遍历
定义:从图中某一顶点出发访遍图中其余顶点,且使每一个顶点仅被访问一次,这一过程叫做图的遍历。
设置一个访问数组,来标记该顶点是否已经被访问过了,visited [ n ],n为图中顶点的个数,初值设为0,若访问过设为1
为了避免因回路陷入死循环,因此需要科学的设计两种遍历次序方案:深度优先搜遍历和 广度优先遍历
1、深度优先遍历
类似于树的前序遍历
2、广度优先遍历
类似于树的后序遍历
具体的代码实现可见 大话数据结构
深度优先遍历和广度优先遍历两者根本上是没有优劣之分的,只不过是不同的方法论而已,深度注重找到,深入细致;广度注重最优,走马观花
三、最小生成树
定义:把构造连通网的最小代价生成树称之为 最小生成树
找连通网的最小生成树,有两种经典算法:
1、普里姆算法(Prim)
已经完全理解了,下一步就是会用该算法
2、克鲁斯卡尔算法(Kruscal)
四、最短路径
网图最短路径含义:两个顶点之间经过的边上的权值之和最小的路径,路径上第一顶点称为源点,最后一个顶点称为终点
非网图最短路径含义:两个顶点之间经过的边数最少
有两种求最短路径的算法
1、迪杰斯特拉算法(Dijkstra)
输入一个起点,求出该起点到其余点的最短路径
讲的比较好的一个博客地址为:http://blog.csdn.net/lhj884/article/details/47307111
2、弗洛伊德算法(Floyd)
求任意两点之间的最短路径
讲的比较好的一个博客地址为:http://blog.csdn.net/LHJ884/article/details/47304481
五、拓扑排序
定义:
设G=(V,E)是一个具有n个顶点的有向图,V中的顶点序列为V1,V2,..................Vn,满族若从顶点 Vi 到 Vj有一条路径,则在顶点序列中顶点Vi必在顶点Vj之前,我们称这样的顶点序列为拓扑排序。