图知识点总结

1.思维导图

 2.重要概念笔记。

a.图的基本概念:
图、无向图、有向图、完全图
度、入度、出度
路径:由顶点和相邻顶点序偶构成的边所形成的序列
连通图、连通分量(无向图)
b.图的存储结构:
包括邻接矩阵、邻接表、逆邻接表
邻接矩阵:不带权图(用0、1表示),带权图(用权重、无穷表示);邻接矩阵第i行之和可求出顶点Vi的度
邻接表:包含顶点表和边表,邻接表不唯一(意味着边表顺序可以不一致)
c.图的遍历BFS、DFS
BFS:广度优先遍历
DFS:深度优先遍历
3.疑难问题
a.最小生成树(Prim,Kruskal)
Prim算法:从图中任意取出一个顶点,把它当成一棵树,然后从与这棵树相接的边中选取一条最短(权值最小)的边,并将这条边及其所连顶点并入当前树中,此时得到了一棵有两个顶点的树。然后从与这棵树相接的边中选取一条最短的边,并将这条边及其所连顶点并入当前树中,得到一棵有3个顶点的树。以此类推,直到图中所有顶点都被并入树中为之,此时得到的生成树就是最小生成树。
Kruskal算法 :选择最短边加入,并且确保不成环路。每次找出候选边中权值最小的边,就将该边并入树中(不能有环),重复此过程直到所有边都被检测完为止。
两个算法对比:
Prim算法:针对顶点,对于稠密图(边数非常多的情况)更好;
Kruskal算法:针对边,对于稀疏图(边数少)时更好。
b.最短路径(Dijkstra、Floyd)
基本概念:最短路径是指两顶点之间经过的边上权值之和最少的路径。
求最短路径的算法:Dijstra算法(从某个源点到其余各顶点的最短路径)、Floyd算法(每一对顶点之间的最短路径)
Dijstra算法:从图中选取到源点v0路径长度最短的顶点并入到集合S中,修改顶点v0到剩下的顶点的最短路径长度值,直到所有顶点都并入到S中为止。
Folyd算法 :Floyd算法是一个经典的动态规划算法。用通俗的语言来描述的话,首先我们的目标是寻找从点i到点j的最短路径。从动态规划的角度看问题,从任意节点i到任意节点j的最短路径,不外乎2种可能,1是直接从i到j,2是从i经过若干个节点k到j。所以,我们假设Dis(i,j)为节点u到节点v的最短路径的距离,对于每一个节点k,我们检查Dis(i,k) + Dis(k,j) < Dis(i,j)是否成立,如果成立,证明从i到k再到j的路径比i直接到j的路径短,我们便设置Dis(i,j) = Dis(i,k) + Dis(k,j),这样一来,当我们遍历完所有节点k,Dis(i,j)中记录的便是i到j的最短路径的距离。

猜你喜欢

转载自www.cnblogs.com/wyjy/p/12892092.html