前面一篇博客介绍了关于图的基本概念和存储问题,这篇博客将就遍历问题、最小生成树问题和单源最短路径问题作讨论,恳请大家多多指导。
遍历
图的遍历从字面理解即可:逐一访问图中的每一个顶点,不漏不重。
深度优先
1、选定图中的一个顶点,可记作V
i;
2、选中的顶点V
i为第一个访问点;
3、任选一个和V
i相连且没有被访问的顶点去访问;
4、重复2/3步骤,直至以V
i顶点为首的一条线被访问完;
5、重复以上步骤,直至图中所有顶点均被访问。
广度优先
1、选定图中的一个顶点,可记作V
i;
2、再访问V
i之后,一次访问和Vi相连的顶点;
3、依次从与顶点V
i相连的顶点出发,并按照广度优先原则遍历和V
i相连的顶点;
4、重复以上步骤,直至图中所有顶点均被访问。
温馨提示
很明显,无论是深度还是广度,结果都不是唯一的。
最小生成树
最小生成树要求在遍历的基础上,做到权值最小。
Prim
步骤
1、初始化
G=(V,E)是一个带权图,生成的最小生成树为MinT=(V,T);其中V是顶点的集合,T为边的集合;
初始化:U=(
u
0),T=(),其中U是已经参加到计算最小生成树的顶点集合。
u
0可以是原始带权图中的任一顶点。
2、从V中取任意一点,记作
V
0,放到U中作第一个参与计算的顶点。
3、从所有u∈U,v∈V-U构成的边(u,v)中,选出最小的边(u',v'),将这条边加入集合T中,将顶点v'加入集合U中。
4、重复3直至U=V。
One Word
Prim算法就是不断从V中取出顶点,并且选出这些顶点之间权值最小的路径,直至所有的顶点都从V中取出。