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

广度优先搜索(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 许可协议。转载请注明出处!