数据结构--------图

来源:互联网 发布:手机贴吧抢二楼软件 编辑:程序博客网 时间:2024/06/02 00:28

一、图的定义:

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之前,我们称这样的顶点序列为拓扑排序。