图总结

1.思维导图

2.重要概念的笔记

图的基本概念

1.含有 e=n(n-1)/2条边的无向图称作完全图

2.含有 e=n(n-1)条弧的有向图称作有向完全图

3.若边或弧的个数 e<nlog2n,则称作稀疏图,否则称作稠密图

4.无向图的邻接矩阵是对称的,有向图的邻接矩阵 可能是不对称的

5.在无向图中,统计第i行(列)1的个数可得顶点i的度;在有向图中,统计第i行1的个数可得顶点i的出度;统计第j列1的个数可得顶点j的入度

图的遍历

1. DFS和BFS的空间复杂度相同,都是O(n)(借用了堆栈或队列);时间复杂度只与存储结构(邻接矩阵或邻接表)有关,而与搜索路径(遍历的顺序)无关

生成树

1.生成树的特点:生成树包含图中所有顶点和n-1条边(但有n-1条边的图不一定是生成树);生成树中任意两个顶点间的路径是唯一的;边数>n-1时,形成环;边数<n-1时则不连通

2. Prim: T(n)=O(n2), 适合边多的稠密度; Kruskl: T(n)=O(elog2e), 适合边少的稀疏图

最短路径

1.求每一对顶点之间的最短路径:每次以一个顶点为源点,重复执行Dijkstra算法n次,时间复杂度为O(n3);弗洛伊德(Floyd)算法:时间复杂度也是O(n3)

有向无环图

1. 检测AOV网是否有环的办法:对有向图构造其顶点的拓扑有序序列,若网中所有顶点都在其拓扑有序序列中,则该AOV网必定不存在环

关键路径

1.求ve的顺序应该是按拓扑有序的次序;求vl的顺序应该是按拓扑逆序的次序

3.疑难问题及解决方案

1.起初对Prim算法的实现不太理解,后来通过网上查询资料理解了

Prim算法的原理为构建closedge数组,每个节点有两个域,分别为对应于生成树的最小权重的节点域以及该节点和最小生成树对应的最小权重数lowcost。通过n-1次遍历,每次遍历都要加入一个与已有节点相邻的最小顶点,然后更新剩余节点的与最小生成树对应的最小权重,以便进行下次遍历,经过n-1次遍历之后得到n-1个与初始顶点相关的节点,同时也就是得到了n-1条弧,构成n个节点的最小生成树。

2.一开始对Dijkstra算法的实现不理解,后来通过网上查询资料理解了

Dijkstra算法是计算源点到其他节点的最短路径的算法。要明白算法的核心,就要深刻理解DIST数组的作用,path二维数组的含义和final数组的标志。Dist数组存储的是每一次遍历后从源点到DIST下标各点的最短路径,若无路径则是无穷大。Path数组中path[i][j]表示从j到i是连通的当然可以间接连通。final[i]为1的时侯表示源点到顶点i已经找到最短路径。

算法的核心就是经过n-1次循环刷新dist,path和final数组从而得到源点到各点的最短路径长度和路径走法。

1.首先dist数组承接源点到各点的路径长度,path数组初始化为false,final初始化为0;

2.然后开始进行n-1次遍历找到源点到其他各点的最短路径:从源点开始找到DIST数组之中对应final不为1的所有元素中的最小值,将该最小值对应的顶点作为“相对源点”(从该顶点开始搜索),其final值标记为1.每次当final[i]为假的时候如果“相对源点”对应的dist数值加上“相对顶点”到新顶点权重值(相对顶点和新顶点是邻接关系)小于新顶点原来的dist值,则更新该dist[新顶点]的值。同时记录从源点到该点的路径,即在path数组中建立相应连接关系。以后的遍历都是找到“相对源点”然后重复上步做法。直至遍历结束。

3.最后按照path数组和源点的对应关系就可打印出所有路径以及各路径的最短距离。

posted @ 2020-05-17 18:41  Vancciiii  阅读(206)  评论(0编辑  收藏  举报