2025-11-10
C#
00

目录

深度优先搜索(DFS)
DFS 算法步骤
DFS 示例代码
广度优先搜索(BFS)
BFS 算法步骤
BFS 示例代码
结论

在计算机科学中,图的遍历是访问图中每个顶点的过程,并尝试按照特定的顺序进行。图的遍历算法主要有两种:深度优先搜索(DFS)和广度优先搜索(BFS)。这两种算法在解决如路径查找、网络爬虫、社交网络分析等问题时都非常有用。

深度优先搜索(DFS)

深度优先搜索(DFS)是一种用于遍历或搜索树或图的算法。它沿着一个分支深入到不能再深入为止,然后回溯到上一个分叉点,可能会继续深入另一分支。这个过程一直持续到所有的顶点都被访问过为止。

DFS 算法步骤

  1. 从一个顶点开始,将其标记为已访问。
  2. 访问该顶点的一个邻接顶点,如果它未被访问,则递归地对其执行DFS。
  3. 重复步骤2,直到所有顶点都被访问。

DFS 示例代码

C#
using System; using System.Collections.Generic; class Graph { private int _V; // 顶点的数量 private List<int>[] _adj; // 邻接表 public Graph(int V) { _adj = new List<int>[V]; for (int i = 0; i < _adj.Length; i++) { _adj[i] = new List<int>(); } _V = V; } // 添加边 public void AddEdge(int v, int w) { _adj[v].Add(w); // 将w添加到v的列表中 } // 深度优先搜索 public void DFS(int v) { bool[] visited = new bool[_V]; DFSUtil(v, visited); } // DFS的辅助函数 private void DFSUtil(int v, bool[] visited) { visited[v] = true; Console.Write(v + " "); List<int> vList = _adj[v]; foreach (var n in vList) { if (!visited[n]) { DFSUtil(n, visited); } } } } // 使用Graph类 class Program { static void Main(string[] args) { Graph g = new Graph(4); g.AddEdge(0, 1); g.AddEdge(0, 2); g.AddEdge(1, 2); g.AddEdge(2, 0); g.AddEdge(2, 3); g.AddEdge(3, 3); Console.WriteLine("以下是从顶点2开始的深度优先遍历"); g.DFS(2); } }

输出:

image.png

广度优先搜索(BFS)

广度优先搜索(BFS)是图的另一种遍历算法,它按层次顺序访问顶点。从起始顶点开始,它先访问所有邻近的顶点,然后再依次访问它们邻近的未访问顶点。

BFS 算法步骤

  1. 将起始顶点加入队列,并标记为已访问。
  2. 当队列非空时,从队列中取出一个顶点。
  3. 访问该顶点的所有未访问过的邻接顶点,将它们加入队列,并标记为已访问。
  4. 重复步骤2和3,直到队列为空。

BFS 示例代码

C#
using System; using System.Collections.Generic; class Graph { private int _V; // 顶点数 private List<int>[] _adj; // 邻接表 public Graph(int V) { _adj = new List<int>[V]; for (int i = 0; i < V; ++i) { _adj[i] = new List<int>(); } _V = V; } // 添加边 public void AddEdge(int v, int w) { _adj[v].Add(w); // 在顶点v的列表中添加w } // 广度优先搜索 public void BFS(int s) { bool[] visited = new bool[_V]; // 标记是否访问过 Queue<int> queue = new Queue<int>(); // 创建队列用于存储待访问的顶点 visited[s] = true; // 标记起始顶点为已访问 queue.Enqueue(s); // 将起始顶点加入队列 while (queue.Count != 0) { s = queue.Dequeue(); // 从队列中取出一个顶点 Console.Write(s + " "); // 打印顶点 // 遍历该顶点的所有邻接点 foreach (int next in _adj[s]) { // 如果未访问,则标记为已访问并加入队列 if (!visited[next]) { visited[next] = true; queue.Enqueue(next); } } } } } // 使用Graph类 class Program { static void Main(string[] args) { Graph g = new Graph(4); // 创建一个包含4个顶点的图 // 添加边 g.AddEdge(0, 1); g.AddEdge(0, 2); g.AddEdge(1, 2); g.AddEdge(2, 0); g.AddEdge(2, 3); g.AddEdge(3, 3); Console.WriteLine("以下是从顶点2开始的广度优先遍历"); g.BFS(2); // 从顶点2开始进行广度优先搜索 } }

输出:

结论

深度优先搜索和广度优先搜索都是图遍历的基本方法,它们各有优缺点。DFS可以更快地找到解决方案,如果存在的话,而BFS可以找到最短路径。在实际应用中,根据问题的性质选择合适的算法至关重要。

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!