• 邻接矩阵有向图的广度优先遍历


    如题,在“图基础-创造用于测试的简单图”文章提到的邻接矩阵有向图代码的基础上,添加了广度优先遍历方法。

    代码如下:

    //0号节点开始,广度优先遍历图
            //思路:把0号节点入栈,从它开始,开始遍历之旅
            public void Bfs()
            {
                //创造遍历需要用到的全局工具
                //队列,保存需要遍历节点的相连节点,实现BFS需要的顺序
                Queue<int> queue = new();
                //标记数组,保存每个点是否已被打印。防止无限输出。
                bool[] flags = new bool[nodes.Length];
                queue.Enqueue(0);
                //开始DFS
                Bfs(queue, flags);
            }
    
            //思路:从队列里取点
            //没打过,就打出来,标记为“打印过”,再把它的相连点入队。
            //打过,就算了。
            public void Bfs(Queue<int> q, bool[] b)
            {
                int x;
                //队不空,就取里面的元素出来
                while (q.Count > 0)
                {
                    x = q.Dequeue();
                    //如果没打印过
                    if (b[x] == false)
                    {
                        //打出来
                        Console.WriteLine(nodes[x] + " ");
                        //标记成“打印过”
                        b[x] = true;
                        //所有相连节点入队
                        //(由于此处不计顺序,故可能有多种结果)
                        for (int i = 0; i < edges.GetLength(1); i++)
                        {
                            if(edges[x,i]==1)
                            {
                                q.Enqueue(i);
                            }
                        }
                    }
                }
            }

    其中,“队列”是广度优先遍历算法中,保证输出顺序正确的关键。

    测试用主程序:

    static void Main(string[] args)
            {
                MyMatrix g1 = new();
                g1.testShow();
                g1.Bfs();
            }

    运行结果:

    顶点信息:v0  v1  v2  v3  v4
    邻接矩阵:
    0 0 1 0 1
    1 0 0 0 0
    0 1 0 1 0
    0 0 0 0 0
    0 0 0 1 0
    v0
    v2
    v4
    v1
    v3

    经目测验证,正确。

  • 相关阅读:
    简单的三级联动练习
    JavaScript中定时器的暂停和继续
    关于ajax网络请求的封装
    关于JS历史
    KVC中setValuesForKeysWithDictionary:
    collectionView 中cell间距设置建议
    iOS中你必须了解的多线程
    iOS中关于动态Tableview中的cell数据传输的多线程问题解决之拙见
    Touch
    Filemanager 的使用
  • 原文地址:https://www.cnblogs.com/wanjinliu/p/14036674.html
Copyright © 2020-2023  润新知