今天小编给大家分享一下c++邻接表是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。图状结构是一种比树形结构更复杂的非线性结构。在树形结构中,结点间具有分支层次关系,每一层上的结点只能和上一层的至多一个结点相关,但可能和下一层的多个结点相关。而在图状结构中,任意两个结点之间都可能相关,即结点之间的邻接关系可以是任意的。因此,图是比树更一般、更复杂的非线性结构,常被用于描述各种复杂的数据对象,在自然科学、社会科学和人文科学等许多领域有着非常广泛的应用。第一节 基本概念1.1 定义和术语(1)定语:图(Graph)是由非空的顶点集合和一个描述顶点之间的关系——边(或者弧)的集合组成的,其形式化定义为:G=(V,E)、V={v1|v1包含data object}、E={(v1,vj)|(vi,vj 包含V^P(vj,vj)。其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合,集合E中P(vi,vj)表示顶点vi和顶点vj之间有一条直接连线,即偶对(v1,vj)表示一条边。如:G2=(V2,E2)、V2={v1,v2,v3,v4}、E2={
2、DestroyGraph(G) :释放图G占用的存储空间。
3、GetVex(G,v):在图G中找到顶点v,并返回顶点v的相关信息。
4、PutVex(G,V,value):在图G中找到顶点v,并将value值赋予给顶点v。
5、InsertVex(G,v):在图G中增添新顶点v。
6、DeleteVex(G,v):在图G中,删除顶点v及所有和顶点v相关的边或弧。
7、InsertArc(G,v,w):在图G中增添一条从顶点v到顶点w的边或弧。
8、DeleteArc(G,v,w):在图G中删除一条从顶点v到顶点w的边或弧。
9、DFSTraverse(G,v):在图G中,从顶点v出发深度优化遍历图G。
10、BFSTtaverse(G,v):在图G中,从顶点v出发广度优先遍历图G。在一个图中,顶点是没有先后次序的,但当采用某一种确定的存储方式存储后,存储结构中顶点的存储次序成了顶点之间的相对次序,这里用顶点在图中的位置表示该顶点的存储顺序;同样的道理,对一个顶点的所有邻接点,采用该顶点的第i个邻接点表示与该顶点相邻接的某个顶点的存储顺序,在这种意义下,图还有以下的基本操作。11、LocateVex(G,u):在图G中找到顶点u,返回该顶点在图中位置。
12、FirstAdjVex(G,v):在图G中,返回v的第一个邻接点。若顶点在G中没有邻接顶点,则返回“空”。
13、NextAdjVex(G,v,w):在图G中, 返回v的(相对于w的)下一个邻接顶点。若w是v的最后一个邻接点,则返回”空”。第二节 存储结构图是一种结构复杂的数据结构,表现在不仅各个顶点的度可以千差万别,而且顶点之间的逻辑关系也错综复杂。从图的定义可知,一个图的信息包括两部分,即图中顶点的信息及描述顶点之间的关系——边或弧的信息。因此,无论采用什么方法建立图的存储结构,都要完整、准确地反映这两方面的信息。2.1 邻接矩阵所谓邻接矩阵(Adjacency Matrix)的存储结构,就是用一维数组存储图中的顶点信息,用矩阵表示图中各顶点之间的邻接关系。假设图G=(V,E)有n个确定的顶点,即V ={v0,v1,,vn-1},则表示G中各顶点相邻关系的矩阵为一个nn的矩阵,矩阵的元素为:A[i][j]={1,若(vi,vj)或
其中,wij表示边(Vi,vj)或
在建立邻接表或逆邻表时,若输入的顶点信息即为顶点的编号,则建立邻接表的复杂度为O(n+e),否则,需要通过查找才能得到顶点在图中位置,则时间复杂度为O(ne)。在邻接表上容易找到任意顶点的第一个邻接点和下一个邻结点,但要判定任意两个顶点(vi和vj)之间是否有边或弧相连,则需查找第i个或第j个链表,因此,不如邻接矩阵方便。第3节 图的遍历图的遍历是指从图中的任意顶点出发,对图中的所有顶点访问一次且只访问一次。图的遍历操作和树的遍历操作功能相似。图的遍历是图的一种基本操作,图的许多其他操作都是建立在遍历操作的基础之上的。3.1 深度优先搜索(Depth First Search,DFS)类似于树的先根遍历,是树的先根遍历的推广。假设初始化状态是图中所有顶点未曾被访问,则深度优先搜索可从图中某个顶点v出发,访问此顶点,然后依然从v的未被访问的邻接点出发深度优化遍历图,直至图中所有和v有路径相通的顶点都被访问到;若此时图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作为起始点,重复上述过程,直至图中所有顶点都被访问到为止。如下图:a所示的无向图G4,进行图的深度优先搜索。假设从顶点v1出发进行搜索,在访问了顶点v1之后,选择邻接点v2。因为v2未曾访问,则从v2出发进行搜索,以此类推,接着从v4,v8,v5出发进行搜索。在访问了v5之后,由于其邻接点都已经被访问了,则搜索回到v8,同理,搜索继续回到到v4,v2,v1。此时,由于v1的另一个邻接点未被访问,则查找又从v1到v3,v6,v7。显然,这是一个递归的过程。为了遍历过程中便于区分顶点是否已被访问,需要附设访问标志数组visited[0:n-1],其初值为FALSE,一旦某个顶点被访问,则其相应的分量置为TRUE。深度优化搜索算法实现:3.2 广度优先搜索(Breadth First Search,BFS)类似于树的按层次遍历的过程。假设从图中某顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点,然后分别从这些邻接 香港云主机点出发依次访问它们的邻接点,并使“先被访问的顶点的邻接点”先于“后被访问的顶点的邻接点”被访问,直至图中所有已被访问的邻接点都被访问到。若此时图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作为起始点,重复上述过程,直至所有顶点都被访问到为止。换句话说,广度优先搜索遍历图的过程是以v为起始点,由近至远,依次访问和v有路径相通且路径长度为1,2,的顶点。如上图中的c,首先访问v1和v1的邻接点v2和v3,然后依次访问v2的邻接点v4和v5及v3的邻接点v6和v7,最后访问v4的邻接点v8。得到访问序列为:v1 →v2→v3→v4→v5→v6→v7→v8。和深度优先搜索类似,在遍历的过程中也需要一个访问标志数组。并且为了顺次访问路径长度为1,2,3的顶点,需要附设队列以存储已被访问的路径长度为1,2,的顶点。从图的某一点v出发,非递归地进行广度优先遍历的过程算法如下所示:下面算法给出了对以邻接矩阵为存储结构的图G进行广度优先搜索实现的C语言描述。广度优先搜索算法:分析上述算法,每个顶点最多进一次队列。遍历图的过程实质是通过边或弧找邻接点的过程,因此广度优先搜索遍历图的时间复杂度和深度优先搜索遍历相同,两者的不同之处仅在于对顶点访问的顺序不同。第4节 图的应用4.1 最小生成树(1)基本概念:由于生成树的定义可知,无向连通图的生成树不是唯一的。连通图的一次遍历所经过的边的集合及图中所有顶点的集合就构成了该图的一棵生成树,对连通图的不同遍历,就可能得到不同的生成树。对于有n个顶点的无向连通图,无论其生成树的形态如何,所有生成树中都有且仅有n-1条边。如果无向连通图是一个网,那么,它的所有生成树中必有一棵生成树的边的权值总和最小,称这样的一棵生成树为最小代价生成树(Minimum Cost Spanning Tree),简称最小生成树(MST)。一棵生成树的代价就是树中所有的边的代价之和。最小生成树的概念可以应用到许多实际问题中。例如,以尽可能低的总价建造城市间的通信网络,把十个城市联系在一起。在这十个城市中,任意两个城市之间都可以建造通信线路,通信线路的造价依据城市间的距离不同而不同,可以构造一个通信线路造价网络,在网络中,每个顶点表示城市,顶点之间的边表示城市之间可构造通信线路,每条边的权值表示该条通信线路的造价,要想使总的造价最低,实际上就是寻找该网络的最小生成树。构造最小生成树的方法很多,其中大多数算法都利用了MST性质。MST性质描述如下:
设G=(V,E)是一个连通网,其中V为网中所有顶点的集合,E为网中所有带权边的集合,再设集合U用于存放G的最小生成树的顶点。若边(u,v)是G中所有一端在U中而另一端在V-U中 具有最小权值的一条边,则存在一棵包含边(u,v)的最小生成树。关于MST性质的证明请参阅有关书籍,这里略去。(2)Prim算法和Kruskal算法假设G =(V,E)为一连通网,其中V为网中所有顶点的集合,E为网中所有带权边的集合。设置两个新的集合U和T,其中集合U用于存放G的最小生成树中的顶点,集合T存放G的最小生成树中的边。令集合U的初值为U={u1}(假设构造最小生成树时,从顶点u1出发),集合T的初值为T={}。Prim算法的思想是,从所有u包含U,u包含V-U的边中,选取具有最小权值的边(u,v),将顶点v加入集合U中,将边(u,v)加入集合T中,如此不断重复,直到U=V时,最小生成树构造完毕,这时集合T中包含了最小生成树的所有边。Prim算法可用下述过程描述,其中用wuv表示顶点u与顶点v边上的权值。Prim算法构造最小生成树的过程示意图如下:为实现Prim算法,需设置两个辅助一维数组lowcost和closevertex,其中,lowcost用来保存集合V-U中各顶点与集合U中各顶点构成的边中具有最小权值的边的权值;数组closevertex用来保存依附于该边的在集合U中的顶点。假设初始化状态时,U={u1(出发的顶点)},这时有lowcost[0]=0,它表示顶点u1已加入集合中,数组lowcost的其他各分量的值是顶点u1到其余各顶点所构成的直接边的权值。然后不断选取最小的边(ui,uk)(u包含U,uk包含V-U),每选取一条边,就将lowcost(k)置为0,表示顶点uk已加入集合U中。由于顶点uk从集合V-U进入集合U后,这两个集合的内容发生了变化,就需依据具体情况更新数组lowcost和closevertex中部分分量的内容。当无向网采用二维数组存储的邻接矩阵存储时,Prim算法如下:在上述算法中,第一个for循环的执行次数为n-1,第二个for循环中又包含了一个while循环和一个for循环,执行次数为2(n-1),所以Prim算法的时间复杂度为O(n)。Kruskal算法基本思想如下:设G=(V, E)是连通网,集合T存放G的最小生成树中的边。初始时,最小生成树中已经包含G中的全部顶点,集合T的初值为T={},这样每个顶点就自成一个连通分量。最小生成树的生成过程是,在图G的边集E中按权值自小至大依次选择边(u, v),若该边端点u、v分别属于当前两个不同的连通分量,则将该边(u, v)加入到T,由此这两个连通分量连接成一个连通分量,整个连通分量数量就减少了一个;若u、v是当前同一个连通分量的顶点,则舍去此边,继续寻找下一条两端不属于同一连通分量的权值最小的边,依此类推,直到所有的顶点都在同一个连通分量上为止。这时集合T中包含了最小生成树的所有边。算法描述如下:Kruskal 算法构造最小生成树的过程示意图:以上就是“c++邻接表是什么”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注开发云行业资讯频道。
小编给大家分享一下css如何使元素鼠标事件失效,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!使元素鼠标事件失效以上是“cs 香港云主机s如何使元素鼠标事件失效”这篇文章的所有内容,感…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。