【基础知识】| 作者 / Edison Zhou
这是恰童鞋骚年的第220篇原创文章
上一篇介绍了图的遍历算法之广度优先搜索遍历,本篇我们再来看看非连通图如何实现遍历。
1关于非连通图的遍历
之前我们讨论的图的两种遍历方法都是针对无向连通图的,它们都是从一个顶点触发就能访问到图中的所有顶点。
若无方向图是非连通图,则只能访问到初始点所在连通分量中的所有顶点,其他分量中的顶点是无法访问到的。
如下图所示,V6、V7以及V8三个顶点均访问不到。为此,需要从其他每个连通分量中选择初始点,分别进行遍历,才能够访问到图中的所有顶点。
2非连通图的遍历实现
深度优先遍历
/// /// 深度优先遍历接口For非联通图/// public void DFSTraverse4NUG(){ InitVisited(); foreach (var v in items) { if (v.isVisited == false) { DFS(v); } }}
这里DFS方法跟上面无向连通图的保持一致。
广度优先遍历
/// /// 广度优先遍历接口For非联通图/// public void BFSTraverse4NUG(){ InitVisited(); foreach (var v in items) { if (v.isVisited == false) { BFS(v); } }}
这里BFS方法跟上面无向连通图的保持一致。
遍历实现测试
构造的图如上图所示,测试代码如下:
static void MyAdjacencyListTraverseTest(){ Console.WriteLine("------------非连通图的遍历------------"); MyAdjacencyList numAdjList = new MyAdjacencyList(); // 添加顶点 numAdjList.AddVertex("V1"); numAdjList.AddVertex("V2"); numAdjList.AddVertex("V3"); numAdjList.AddVertex("V4"); numAdjList.AddVertex("V5"); numAdjList.AddVertex("V6"); numAdjList.AddVertex("V7"); numAdjList.AddVertex("V8"); // 添加边 numAdjList.AddEdge("V1", "V2"); numAdjList.AddEdge("V1", "V4"); numAdjList.AddEdge("V2", "V3"); numAdjList.AddEdge("V2", "V5"); numAdjList.AddEdge("V4", "V5"); numAdjList.AddEdge("V6", "V7"); numAdjList.AddEdge("V6", "V8"); Console.Write("深度优先遍历:"); // DFS遍历 numAdjList.DFSTraverse4NUG(); Console.WriteLine(); Console.Write("广度优先遍历:"); // BFS遍历 numAdjList.BFSTraverse4NUG();}
运行结果如下图所示:
3小结
本篇介绍了非连通图如何实现遍历,下一篇,我们来学习一下最小生成树算法。
4参考资料
程杰,《大话数据结构》
陈广,《数据结构(C#语言描述)》
段恩泽,《数据结构(C#语言版)》