数据结构-图总结

图总结

一、思维导图:

二、重要概念的笔记及个人解析

1)图:

​ 所有的图都由顶点和边构成,分有向图和无向图,连通图和非连通图。

2)端点与邻接点:

​ 若两点i、j之间有边,则这两个点为两个端点,并且他们互为邻接点。

3)顶点的度、入度和出度:

​ 一个顶点连接n条边,则这个顶点的度就为n,若边有向,则有多少朝向该顶点的边m条,它的入度就为m,有多少从该点出发的边s条,出度就为s。

4)路径和路径长度:

​ 在一个图中,从顶点i到顶点j的一条路径就是一路上经过的顶点的序列,沿途经过n条边,则路径长度就为n。

5)权和网:

​ 一个图的每一条边都可以附有一个对应的数值,这个数值称为权,权可以表示经过这条边所需要的距离或代价,边上有权的图被称为带权图,也可以被称为网。

6)邻接表存储:

​ 建立一个单链表,每一个节点都是图中的不同顶点,每个节点上再链接一个头节点,通过这个头节点将与该顶点有关的其他顶点储存起来,从而达到存储顶点信息和边的信息。

7)邻接矩阵存储:

​ 逻辑结构分为两部分,用一个一维数组存放图中所有顶点数据,用一个二维数组存放顶点间关系,邻接矩阵又分为有向图邻接矩阵和无向图邻接矩阵。

8)十字链表:

​ 十字链表是邻接表和逆邻接表的结合,需要分别构造横向链接和纵向链接。

9)图的深度优先遍历:

​ 从图中的某个顶点V出发,访问此顶点,然后依次从该顶点的各个未被访问的邻接点出发进行深度优先遍历,直到图中所有和V有路径相通的顶点都被访问到。

10)图的广度优先遍历:

​ 从图中的某顶点V出发,并在访问此顶点后依次访问V的所有未被访问过的邻接点,之后按这些顶点被访问的顺序依次访问它们的邻接点,直到图中所有和V有路径相遇的顶点都被访问到。

11)生成树与最小生成树:

​ 一个连通图的生成树是一个极小连通子图,其中含有图中的全部顶点,图的所有生成树中具有边上的权值之和最小的树称为最小生成树。

12)普里姆算法:

​ 普里姆(Prim)算法是一种构造性算法,具体步骤为:将某一个顶点V加入确定结合U中,从候选边中挑选权值最小的边,将其连接的顶点加入集合U中,再在U中的所有顶点中查找权值最小的边(U集合中的顶点之间的边已确定,不算)再将这条边连接的顶点加入集合U,循环往复,直到所有顶点都加入集合U中,记录的这些边所连接而成的树就为最小生成树。

13)克鲁斯卡尔算法:

​ ①设一个顶点的集合U

​ ②将图G中的边按权值从小到大的顺序依次选取,若选取的边未使生成树T形成回路,则加入U,否则舍弃,直到U中包含(n一1)条边为止。

14)贪心算法:

​ 算法原理:以当前情况为基础作最优选择,而不考虑各种可能的整体情况,所以贪心法不要回溯

​ 算法优点:因为省去了为寻找解而穷尽所有可能所必须耗费的大量时间,因此算法效率高。

​ 注意事项:贪婪算法的精神就是“只顾如何获得眼前最大的利益”,有时不一定是最优解。

15)迪杰斯特拉算法解决最短路径问题:

​ 采用狄克斯特拉(Dijkstra)算法求解,其基本思想是,有一个带权有向图,把图中的顶点集合V分成两组,第1组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点),第2组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第2组的顶点加入S中。

16)弗洛伊德算法解决最短路径问题:

​ 弗洛伊德(Floyd)算法用于解决每一对顶点之间的最短路径利用邻接矩阵的存储性质,逐个点进行试探,选出一条长度最短的路径。

17)拓扑排序:

​ 排序方法:寻找入度为0的顶点,将其加入序列,再将这个顶点以及它的出度的边从图中去除,再寻找下一个入度为0的顶点,重复操作,直到将所有顶点都纳入序列之中,则这个序列就为拓扑排序。

18)AOV网:

​ 用顶点表示活动,用弧表示活动时间的优先关系的有向图称为顶点表示活动(Activity On Vertex Network)的网,简称AOV网。

19)AOE网:

​ 用顶点表示事件,用弧表示活动,权表示活动持续时间(Activity On Edge Network)的网,简称AOE网。

​ ①V的最早发生时间:从源点开始到达该顶点的最长路径长度。

​ ②V的最迟发生时间:在不推迟整个工期的前提下,事件V允许的最晚发生时间。

20)关键路径:

​ 若一个顶点所代表的事件V的最早发生时间与最晚发生时间相同,则可以确定该事件为关键活动,由所有关键活动所连成的那一条路径就为关键路径。

三、疑难问题及解决方案

1)迪杰斯特拉算法的代码实现:

​ 迪杰斯特拉算法所要实现的功能以及实现方法我都是理解的,但是在利用代码实现这一算法时,我不明白算法是怎样实现这一算法的。

解决:在看了其他人的代码,以及重温了很多遍老师的代码后,以画图的方式进行了理解,

for(i=1;i<n;++i){
    min=MaxInt;
 for(w=0;w<n;++w)
     if(!s[w]&&D[w]<min){
         v=w;
         min=D[w];
     }//选择一条当前最短路径
 S[v]=true;//将v加入s
 for(w=0;w<n;++w)//加入v后,vO到其他节点需更新
     if(!s[w]&&(D[v]+G.arcs[v][w]<D[W]){
         D[w]=D[v]+G.arcs[v][W];
             Path[w]=v;
     }
        }

posted @ 2020-05-16 20:39  勤政  阅读(573)  评论(0编辑  收藏  举报