广度优先遍历 C#

本文介绍了一种使用C#实现的简单图结构,并通过广度优先搜索(BFS)算法进行节点遍历。示例中定义了一个简单的图结构,每个节点包含其相邻节点列表。通过广度优先搜索算法实现了从指定起始节点开始遍历所有可达节点的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

using System.Collections;
using System.Collections.Generic;

namespace ConsoleApp1
{
    class SimpleGraph
    {
        public SimpleGraph()
        {
            // 初始化边表
            edges = new Dictionary<char, char[]>();
        }

        public Dictionary<char, char[]> edges;

        public char[] neighbors(char id)
        {
            return edges[id];
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            // 初始化图
            SimpleGraph example_graph = new SimpleGraph();
            char[] A = { 'B' };
            char[] B = { 'A', 'C', 'D' };
            char[] C = { 'A' };
            char[] D = { 'E', 'A' };
            char[] E = { 'B' };
            example_graph.edges.Add('A', A);
            example_graph.edges.Add('B', B);
            example_graph.edges.Add('C', C);
            example_graph.edges.Add('D', D);
            example_graph.edges.Add('E', E);

            breadthFirstSearch(example_graph, 'A');

            // 防止退出
            Console.ReadKey();
        }

        private static void breadthFirstSearch(SimpleGraph graph, char start )
        {
            // 初始化队列
            Queue queue = new Queue();
            queue.Enqueue(start);
            Dictionary<char, bool> visited = new Dictionary<char, bool>();
            visited[start] = true;

            while (queue.Count != 0)
            {
                char current = (char)queue.Dequeue();
                Console.WriteLine("Visiting: " + current );
                foreach (char next in graph.neighbors(current))
                {
                    if (!visited.ContainsKey(next))
                    {
                        queue.Enqueue(next);
                        visited[next] = true;
                    }
                }
            }
        }
    }
}
### 关于C#中实现广度优先遍历算法 在C#中,通过定义一个图的数据结构并利用队列来辅助完成广度优先搜索(BFS),可以有效地遍历图中的各个节点。下面展示的是基于`LinkedList<int>`构建的邻接表形式的图,并实现了BFS方法。 #### 定义图类及其成员变量 为了存储图的信息,在这里创建了一个叫做`BfsGraph`的类[^3]: ```csharp using System; using System.Collections.Generic; public class BfsGraph { private readonly int _V; // 图中顶点的数量 private readonly LinkedList<int>[] _adj; // 存储每个顶点相邻关系的链表数组 public BfsGraph(int v) { this._V = v; _adj = new LinkedList<int>[v]; for (var i = 0; i < v; ++i) _adj[i] = new LinkedList<int>(); } /// 添加边的方法 public void AddEdge(int u, int v) => _adj[u].AddLast(v); } ``` 此部分初始化了图对象所需的两个主要属性:一个是代表顶点数量的整型变量;另一个是由多个链接列表组成的数组,用来保存每一个顶点与其他顶点之间的连接情况。 #### 实现广度优先搜索函数 接下来是具体的BFS逻辑实现,其中使用到了队列作为辅助工具来进行层次化访问: ```csharp /// 执行广度优先搜索操作 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){ var currentVertex = queue.Dequeue(); Console.Write($"{currentVertex} "); foreach(var adjVertex in _adj[currentVertex]){ if(!visited[adjVertex]){ visited[adjVertex] = true; queue.Enqueue(adjVertex); } } } } ``` 这段代码首先标记起点已被访问并将之加入到待处理序列当中。之后进入循环体内部,每次取出最先进入队列的那个元素进行输出,并将其所有未被探索过的邻居依次放入等待队列里继续后续的操作直至整个过程结束为止[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值