图总结

一.思维导图

二.重要概念

1.完全图

若无向图中的每两个顶点之间都存在一条边,有向图中的每两个顶点之间都哦存在着方向相反的两条边,则称此图为完全图。

2.简单路径

一条路径上除开始点和结束点可以相同以外,其他顶点均不相同。

3.遍历

(1)DFS

从图中的某个初始点v出发,首先访问初始点v,然后选择一个与顶点v相邻且没被访问过的顶点w,以w为初始顶点,再从它出发进行深度优先遍历,直到图中与顶点V邻接的所有顶点都被访问过为止。

(2)BFS

首先访问初始点U,接着访问顶点V的所有未被访问过的邻接点v0,v1,...,vt然后再按照v0,v1,...,vt的次序访问每一个顶点的所有未被访问过的邻接点依此类推,直到图中所有和初始点V有路径相通的顶点都被访问过为止。

4.Prim算法

普里姆算法在找最小生成树时,将顶点分为两类,一类是在查找的过程中已经包含在树中的(假设为 A 类),剩下的是另一类(假设为 B 类)。
对于给定的连通网,起始状态全部顶点都归为 B 类。在找最小生成树时,选定任意一个顶点作为起始点,并将之从 B 类移至 A 类;然后找出 B 类中到 A 类中的顶点之间权值最小的顶点,将之从 B 类移至 A 类,如此重复,直到 B 类中没有顶点为止。所走过的顶点和边就是该连通图的最小生成树。
记顶点数v,边数e,则时间复杂度:邻接矩阵:O(v) 邻接表:O(elog2v)。

5.Kruskal算法

将所有的边按照权重非递减排序,选择最小权重的边,判断是否其在当前的生成树中形成了一个环路。如果环路没有形成,则将该边加入树中,否则放弃,重复步骤2,直到有V - 1条边在生成树中。
Kruskal算法的时间复杂度由排序算法决定。

6.Dijkstra算法

算法步骤:
a.初始时,S只包含源点,即S={v},v的距离为0。U包含除v外的其他顶点,即:U={其余顶点},若v与U中顶点u有边,则<u,v>正常有权值,若u不是v的出边邻接点,则<u,v>权值为∞。
b.从U中选取一个距离v最小的顶点k,把k,加入S中(该选定的距离就是v到k的最短路径长度)。
c.以k为新考虑的中间点,修改U中各顶点的距离;若从源点v到顶点u的距离(经过顶点k)比原来距离(不经过顶点k)短,则修改顶点u的距离值,修改后的距离值的顶点k的距离加上边上的权。
d.重复步骤b和c直到所有顶点都包含在S中。
一般算法的运行时间是(On^2)。

7.拓扑排序

步骤:
a.从有向图中选择一个没有前驱的顶点并且输出它。
b.从图中删去该顶点,并且删去从该顶点发出的全部有向边。
c.重复上述两步,直到剩余的图中不再存在没有前驱的顶点为止。

三.疑难问题

关键路径:在AOE网中,从源点到汇点的所有路径中具有最大路径长度的路径。
关键路径这部分有着不少概念,且不是很好理解。
概念:事件发生的最早发生时间,最迟发生时间,活动的最早开始时间,最晚开始时间。
在网上找到了一篇有用的文章
文章链接:https://www.jianshu.com/p/1857ed4d8128

posted @ 2020-05-15 19:11  皮皮皮(童浚)  阅读(197)  评论(0编辑  收藏  举报