- 图:对结点的前驱和后继不加限制
- 图:有向图和无向图,定点集合V和边的结合E
- 多重图:G中多次出现一条边
- 顶点的度:出度、入度,图的总度数=边数*2
- 路径、路径长度、简单路径(没有除了起点和重点之外的相同起点)、简单回路
- 子图,支撑子图
- 连通、强连通图
- 连通分量(不唯一)
- 权图
- 邻接矩阵存储
- 邻接表存储(数组+链表)
- 深度优先遍历(类似树的先根遍历),递归实现,n的平方复杂度
- 深度优先的迭代算法:栈,弹出的顶点未访问过,则未访问过的邻居入栈
- 广度优先遍历(类似树的层次遍历),队列实现
- 拓扑排序:AOV网络没有环(关键路径:软件工程中常用)
- 拓扑排序算法基本思想:选择一个入度为0的点输出,删除该顶点及所有出边,继续,直到所有顶点已经输出或没有入度为0的点(说明有环)
- 算法实现:用数组sount记录入度
- 用数组模拟栈的思想:top,拓扑排序时间负责度O(n+e)
- 关键路径:从源点到汇点的最长路径长度
- 最早发生时间的递推公式,最晚发生时间的递推公式
- 最短路径:Dijstrka算法:n的平方复杂度
- Floyd算法:任意两个点之间的最短路径:n^3
l定义一个n阶方阵序列:A(-1), A(0), …, A(n-1).
其中 A(-1) [i][j] = Edge[i][j];
对于任意0 ≤ k ≤ n-1,A(k) [i][j] = min{ A(k-1)[i][j] , A(k-1)[i][k] + A(k-1)[k][j] }。 -
l时间复杂度:Floyd算法的时间复杂度为O(n3),与调用n次Dijkstra算法求每对顶点的最短路径的时间复杂度相同。
²稠密图:实践表明Floyd算法更快
²稀疏图:通过使用堆, Dijkstra算法的时间复杂度还能进一步提高。
l适用的问题:Dijkstra算法仅针对正权图,而Floyd算法允许图中有带负权值的边,但不允许有包含带负权值的回路,
l可读性:Floyd算法更简单、易于理解。
- 最小支撑树:支撑树:支撑子图+自由树(任意顶点之间有且只有一条路径连接的无向图),权值最小
- Prim算法:
l基本步骤:
设为N=(V, E, C)连通网,TE是N的最小支撑树的边的集合。
① 算法开始时,U= {u0}(u0∈V),TE=空;
② 找到满足权值等于min{weight(u‘’, v‘’) | u‘’∈U, v‘’∈V-U},
的边(u, v),将其加入TE中,并将v加入U。
③ 反复执行② , 直至 U= V时终止算法。 - l最小支撑树的存储方法:使用辅助数组TE[n-1]保存最小支撑树的边集合,每个数组元素TE[i]表示一条边,TE[i]由三个域head、tail和cost构成,它们分别存放边的始点、终点和权值。
- 时间复杂度:N^2
- 克鲁斯卡尔(Kruskar)算法
-
设连通网N=(V, E, C),T为N的最小支撑树。初始时T={V, {Æ}},即T中没有边,只有n个顶点就是n个连通分量。
①从E中选择权值最小的边,并将此边从E中删除。
②如果此边的两个顶点在T的不同的连通分量中,则将此边加入到T中,从而导致T中减少一个连通分量;否则,此边的两个顶点在的同一个连通分量中,不做任何操作。
③则重复执行①②,直至T中仅剩一个连通分量时,终止操作。
- O(e log e) = O(e log n)
-
l普里姆算法的时间复杂性为O(n2),算法适用于求边稠密网的最小支撑树。
l克鲁斯卡尔算法正好相反,它适用于求边稀疏网的最小支撑树,因为它的时间复杂性为O(e log n) 。
-
图 整理
最新推荐文章于 2022-05-25 00:00:48 发布