是否还有其他没有被访问过的邻接顶点:如果有,则访问此顶点,之后再从此顶点
出发,进行与前述类似的访问;如果没有,就再退回上一步进行搜索。重复上述过
程,直至连通图中所有顶点都被访问过为止;
2 需要建立一个辅助数组,判断顶点是否被访问过。
广度优先遍历算法:
1 从图的某一结点出发,首先依次访问该结点的所有邻接结点,再按照这些顶点被访问
的先后次序依次访问与它们相邻接的所有未被访问的结点。重复此过程,直至所有顶
点均被访问为止。
2 需要建立一个辅助队列和辅助数组,由于广度优先类似与层次遍历,如果顶点未访问
过,则实行入队;如果顶点访问过,则实行出队,其未被访问过的邻接点入队,通过
队列实现①中的部分功能,出队的元素顺序即为广度优先遍历的结果。
3、最小生成树的算法实现
利用普里姆(Prim)算法或克鲁斯卡尔(Kruskal)算法求上图的最小生成树,算法
实现代码必须有注释。
无论是普里姆(Prim)算法还是克鲁斯卡尔(Kruskal)算法,都利用了 MST 性质
构成最小生成树。MST 性质:设 N=(V,E)是一个连通网,U 是顶点集 V 的一个非空
子集。若边(u,v)是一条具有最小权值的边,其中 u∈U,v∈V-U,则必存在一棵包
含边(u,v)的最小生成树。在生成树的构造过程中,图中 n 个顶点分属两个集合:①
已落在生成树上的顶点集:U;②尚未落在生成树上的顶点集:V-U。接下来则应在所
有连通 U 中顶点和 V-U 中顶点的边中选取权值最小的边。
普里姆(Prim)算法:
设 N=(V,E)是连通网,TE 是 N 上最小生成树中边的集合。初始令 U={u0},
(u0∈V), TE={},在所有 u∈U,v 属于 V-U 的边(u,v)∈E 中,找一条代价最
小的边(u0,v0),将( u0,v0)并入集合 TE,同时 v0 并入 U。重复上述操作直至
U=V 位置,则 T=(V,TE)为 N 的最小生成树;
克鲁斯卡尔(Kruskal)算法:
设连通网 N=(V,E),令最小生成树初始状态为只有 n 个顶点而无边的非连通图
T=(V,{}),每个顶点自成一个连通分量。在 E 中选取代价最小的边,若该边依
评论5