图结构

介绍:

图是一种复杂的非线性结构,图型结构在每个节点中的元素关系是任意的,图G由两个集合V和E组成,定义G=(V,E),其中V是点的有限非空集合,E是由V的点表示的边的集合。

对于图G,可大致分成两种方式,如果每条边都有方向称为有向图,否则是无向图。

在无向图中存在一条边表示(vi,vj),称为边的两个端点,并称为邻接点,通常用n表示图中的结点数,用e表示图中边的数,不考虑结点到自身的边,任意结点都有边相连就称为完全无向图,在有向图中任意结点都有两个相反的边的称为完全有向图。

若在无向图中,顶点和顶点之间存在一条路径,如果路径长度处了顶点和终点为同一顶点外,其余顶点均不相同称为简单路径,若简单路径中起点和终点为同一顶点则称为回路或环。图中任意顶点之间存在路径,则称为连通图。无向图的极大连通子图称为连通分量。

在有向图中,对任意两个顶点之间互相有路径,则称为强连通图,有向图的极大连通子图称为强连通分量。

若在一个图的每条边上标上某种数字,称为边的全,边上带权的图称为带权图。

存储结构:

常用两种结构,邻接矩阵和邻接表。

邻接矩阵是表示图形顶点之间相邻关系的矩阵。设G=(V,E)是具有n个顶点的图,则G邻接矩阵定义n阶方阵:

A[i][j] = {1 若(vi,vj) 或 <vi,vj> 是G的边},{0 若(vi,vj)或<vi,vj> 不是G的边}

对于有向图,可以有两个矩阵,一个表示出边,另一个入边。由于无向图的邻接矩阵是对称的,可以采用压缩存储元素。

邻接表是图的一种链式存储结构。对于图中G中的每个顶点vi,把所有的邻接vi的顶点vj链接成一个单链表,称为vi的邻接表。

表中结点有两个域:其一为邻接点域(顶点),存储与vi关系的vj的值,其二,为指针域,存储下一个邻接结点。在每一个邻接顶点中存储一个顶点域和链表指针来读取图。

图的遍历:

  深度优先遍历类似树的前序遍历,假设图的所有顶点没有访问过,则从图的中的任意顶点为起始点,标记访问过得顶点,然后依次遍历每个邻接点,直到起始点相通的顶点都被访问,重复直到图中所有顶点都被访问。对图进行深度优先遍历时,按顶点的先后顺序访问的顶点称为图的深度优先遍历序列。

  广度优先搜索遍历,类似树的按层次遍历,通过图的层数来访问顶点,先被访问的顶点,其邻接点也被访问,符合队列先进先出。所以算法需要队列来记录被访问的顶点。

图的生成树和最小生成树:

在图的表示中,一般树定义为无回路的连通图,一个连通图的子图如果是包含所有顶点的树,称为生成树。生成树是连通图包含所有顶点的一个极小连通子图(边最少)。

最小生成树,采用不同的遍历算法生成不同的树,对于有权图把生成树各边的权值总和称为树的权,把权值最小的生成树称为最小生成树。

1.普里姆算法

   假设G=(V,G)是具有n个顶点的连通图,T=(U,TE)是G的最小生成树,其中U是T的顶点集,TE是T的边集,U和TE的初值为空。算法开始,首先从V中任取一个顶点,将它放入U中,此时U={v1}。然后U是V的真子集,知道那些端点在T中,另一端的顶点在T外的所有边中,找一条最短(权值最小)的边,假定为(vi,vj),其中vi 属于U,vj 属于V-U,把vi和vj的边加入TE,顶点加入U,如此反复,直到U=V,TE包含n-1边,T就是最小生成树。

2.克鲁斯卡尔算法

  假设G=(V,E)是一个具有n个顶点的连通图,T=(U,TE)是G的最小生成树,U的初值等于V,包含有G的全部顶点。T的初始状态包含n个顶点而无边的森林T=(V,Ø),将图G中的边按权值从小到大依次选取E中的边(u,v),若选取的边使生成树T不形成回路,则加入TE中,否则舍弃,如此进行直到TE中包含n-1边,此时T为最小生成树。

最短路径:

Dijkstra提出按路径长度递增的顺序产生顶点的最短路径算法,算法思想设有向图G=(V,E),其中V={1,2...n},cost表示G的邻接矩阵,cost[i][j]表示有向边<i,j>的权。若不存在<i,j>,则权为无穷大。设S是一个集合,其中每一个元素表示一个顶点,从源点到这些顶点的最短距离已经求出。设顶点v1是源点,集合S的初始只包含顶点v1。数组dist记录源点到其它顶点当前最短距离,其初值为dist[i]=cost[v1][i],i=2...,n。从S之外的顶点集合V-S选出一个顶点w,使dist[w]的值最小。从源点到达w只通过S中的顶点,把w加入集合S中并调整dist记录的从原点到V-S中每个顶点的距离,即从原来的dist[v]和dist[w]+cost[w][v]中选择较小的值作为新的dist[v]。重复过程,直到S中包含V中其余顶点的最短路径。

上一篇:利用Xilinx的cordic ip做开方运算


下一篇:图的应用:最小生成树、最短路径、拓扑排序、关键路径