大话数据结构7之图

1.图(graph)是由顶点的有穷非空集合和顶点之间边等集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。

    线性表中数据元素称为元素,树中称为结点,图中称为顶点。

    图结构中不允许没有顶点。

    图中,任意两个顶点之间都可能有关系,顶点之间的逻辑关系用边来表示,边集可以是空的。

 2.各种图定义

    无向边:若顶点vi 到vj之间的边没有方向,则称这条边为无向边(edge),用无序偶对(vi,vj)来表示。

    无向图:图中任意两个顶点之间的边都是无向边。

    有向边:若顶点vi 到vj之间的边有方向,则称这条边为有向边,也称为弧(Arc)。

    有向图:图中任意两个顶点之间的边都是有向边。

    连接顶点A到D的有向边就是弧,A是弧尾,D是弧头,<A,D>表示弧,注意不能写成<D,A>.

    简单图:在图中,不存在顶点到其自身的边,且同一条边不重复出现。

    无向完全图:在无向图中,任意两个顶点之间都存在边。含有n个顶点的无向完全图有n*(n-1)/2条边。

    有向完全图:在有向完全图中,任意两个顶点之间都存在方向互为相反的两条弧。n*(n-1)条弧

    有很少条边或弧的图称为稀疏图,反之称为稠密图。

    有些图的边或弧具有与他相关的数字,这种与图的边或弧相关的数叫做权(weight).

    这种带权的图通常称为网(network)。

    假设有两个图G=(V,{E})和G=(V’,{E‘}),如果V’属于V且E‘属于 E,则称G‘为G的子图(subgraph)。

3.图的顶点与边间关系

    对于无向图G=(V,{E}),如果边(V,V‘)属于E,则称顶点v和v'互为领接点(adjacent),即v和v'相邻接。边(v,v')依附(incident)于顶点v和v',或者说(v,v')与顶点相关联。顶点v的度(degree)是和v相关联的边的数目,记为TD(v)。边数就是各顶点度数和的一半。

    对于有向图G=(V,{E}),如果弧<v,v'>属于E,则称顶点v邻接到顶点v‘,顶点v'邻接自顶点v。弧<v,v'>和顶点v,v'相关联。以顶点v为头的弧的数目称为v的入度(InDegree),记为ID(v);以v为尾的弧度数目称为v的出度(outDegree),记为OD(v);顶点v的度为TD(v)=ID(v)+OD(v)。各顶点出度和等于入度和。

    无向图G=(V,{E})中从顶点v到顶点v'的路径(path)是一个顶点序列(v=vi,0,vi,1,...,vi,m=v'),其中(vi,j-1,vi,j)属于E,1=<j<=m.

    树中根结点到任意结点到路径是唯一的,但图中顶点与顶点之间的路径确是不唯一的。

    路径的长度是路径上的边或弧的数目。

    第一个顶点到最后一个顶点相同的路径称为回路或环(Cycle)。序列中顶点不重复出现的路径称为简单路径。除了第一个顶点和最后一个顶点之外,其余顶点不重复出现的回路,称为简单回路或简单环。

4.连通图相关术语

    在无向图G中,如果从顶点v到顶点v'有路径,则称v和v'是连通的。如果对于图中任意两个顶点vi,vj属于E,vi和vj都是连通的,则称G是连通图(Connected Graph)。

    无向图中的极大连通子图称为连通分量。

    在有向图G中,如果对于每一对vi,vj属于V、v i不等于vj,从vi到vj和从vj到vi都存在路径,则称G是强连通图。有向图中的极大强连通子图称作有向图的强连通分量。

    一个连通图的生成树是一个极小的连通子图,它含有图中全部的n个顶点,但只有足以构成一棵树的n-1条边。

    如果一个有向图恰有一个顶点的入度为0,其余顶点的入度均为1,则是一棵有向树。

    一个有向图的生成森林由若干棵有向树组成,含有图中全部顶点,但只有足以构成若干棵不相交的有向树的弧。

5.图的存储结构(5种)

    a.邻接矩阵

      图的邻接矩阵(adjacency matrix)存储方式是用两个数组来表示图。一个一维数组存储图中顶点信息,一个二维数组(称为邻接矩阵)存储图中的边或弧的信息。

      无向图的边数组是一个对称矩阵。

      有向图讲究入度与出度,顶点vi的入度为vj列各数之和,顶点vi出度为第vj行的各数之和。

      时间复杂度O(n2)的时间。

    b.邻接表

      数组与链表相结合的存储方法称为邻接表。(Adjacency List)

      无向图的邻接表叫顶点vi的边表,有向图则称为顶点vi作为弧尾的出边表。一个有向图的逆邻接表,即对每个顶点vi都建立一个链接为vi为弧头的表。

    c.十字链表

      把邻接表与逆邻接表结合起来,即容易找到以v为尾的弧,也容易找到以v为头的弧,因而容易求得顶点的出度和入度。

    d.邻接多重表

ivex ilink jvex jlink

      其中ivex和jvex是与某条边依附的两个顶点在顶点表中下标。link指向依附顶点ivex的下一条边,jlink指向依附顶点jvex的下一条边。这就是邻接多重表结构

      邻多重链表与邻接表带差别,仅仅是在于同一条边在邻接表中用两个结点表示,而在邻接多重链表中只有一个结点。

    e.边集数组

      边集数组是由两个一维数组构成。一个存储顶点的信息;另一个是存储边的信息,这个边数组每个数据元素由一条边的起点(begin)、终点下标(end)、和权(weight)组成。

6.图的遍历

    从图中某个顶点出发访遍图中其余顶点,且每一个顶点仅被访问一次,这一过程就叫做图的遍历(traversing graph)。

    深度优先遍历(depth first search),也称为深度优先搜索,简称为DFS。(类似树的前序遍历)

      它从图中某个顶点v出发,访问此顶点,然后从v的未被访问的 邻接点出发深度优先遍历图,直至图中所有和v有路径想通的顶点都被访问到。若图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作为起始点,重复上述过程,直至图中所有顶点都被访问到为止。

    广度优先遍历(Breadth First Search),又称为广度优先搜索,简称BFS。(类似树的层序遍历)

      深度优先更适合目标比较明确,已找到目标为主要目的的情况,而广度优先搜索跟适合在不断扩大遍历范围时找到相对最优解的情况。

7.最小生成树

    把构造连通网的最小代价生成树称为最小生成树(Minimum cost spanning tree)。

    a.普里姆(prim)算法:以某顶点为起点,逐步找各顶点上最小权值的边来构建最小生成树的。对于稠密图,即边数非常多的情况会好一些。

    b.克鲁斯卡尔(Kruskal)算法:主要针对边来展开,边数少时效率会非常高,对于稀疏图有很大优势;

8.最短路径

    对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,并且我们称路径上的第一个顶点是源点,最后一个顶点是终点。非网图完全可以理解为所有的边的权值都为1的网。

    a.迪杰斯特拉(Dijkstra)算法:解决了从某个源点到其余各顶点的最短路径问题。

    b.弗洛伊德(Floyd)算法:如果面临需要求所有的顶点至所有顶点的最短路径问题时,这是个不错的选择

9.拓扑排序

    在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,我们称为AOV网(Activity On Vertex Network)。(不能存在回路)

    设G=(V,E)是一个具有n个顶点的有向图,V中的顶点序列v1,v2,。。。vn,满足若从顶点vi到vj有一条路径,则在顶点序列中顶点v必在顶点v之前。则我们称这样的顶点序列为一个拓扑序列。

    所谓拓扑排序,其实就是对一个有向图构造拓扑序列的过程。构造时,若此网的全部顶点都被输出,则说明它是不存在环(回路)的AOV网;如果输出顶点少了,也说明这个网存在环(回路),不是AOV网。

    拓扑排序时为了解决一个工程是否顺序进行的问题,但有时我们还需要解决工程完成需要的最短时间问题。

10.关键路径

    在一个表示工程的带权有向图中,用顶点表示事件,用有向边表示活动,用边上的权值表示活动,用边上的权值表示活动的持续时间,这种有向图的边表示的活动的网,我们称之为AOE网(Activity On Edge Network)。AOV网是顶点表示活动的网,它只描述活动之间的制约关系,而AOE网是用边表示活动的网,边上的权值表示活动持续的时间。

    路径上各个活动所持续的时间之和称为路径长度,从源点到汇点具有最大长度的路径叫关键路径,在关键路径上的活动叫关键活动。

    

         

 

 

      

      

 

    

posted @ 2017-10-23 16:03  一南瓜子  阅读(345)  评论(0编辑  收藏  举报