首发于 算法入门笔记
算法——广度优先搜索

算法——广度优先搜索

概念:

"广度优先搜索"是一种通过逐层遍历所有访问对象,从而找到通过最短节点数到达目标的算法。

学习准备:

学习前,需要先掌握图(Graph)、队列(queue)、栈(stack)的概念。还得了解“邻接矩阵”的用法。

示例:

在下图(graph)中,找到从A点到H点的最短距离。


广度优先算法的搜索方式:通过逐层遍历所有相邻节点,从而暴力的找出最短路径。如下图:


代码演示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;//调用queue的时候需要该名称空间


namespace 广度优先搜索
{

    class nodeClass
    {
        public string nodeName;
        public bool isVisited;
        public nodeClass(string name)//类的构造器
        {
            nodeName = name;
        }
    }

    class Gragh
    {
        const int nodeNumMax = 10;
        nodeClass[] nodes = new nodeClass[nodeNumMax];//节点数组
        int[,] adjmatrix = new int[nodeNumMax, nodeNumMax];

        int nodeNumNow = 0;//统计当前有几个节点数

        public Gragh()//利用类构造器的优先机制,首先初始化图的关系矩阵
        {
            for (int i = 0; i < nodeNumMax; i++)
            {
                for (int j = 0; j < nodeNumMax; j++)
                {
                    adjmatrix[i, j] = 0;
                }
            }
        }

        public void addNode(string newNodeName)
        {
            nodes[nodeNumNow] = new nodeClass(newNodeName);
            nodeNumNow++;
        }

        public void addEdge(int nodeNum1, int nodeNum2)
        {
            adjmatrix[nodeNum1, nodeNum2] = 1;
        }

        public void displayNode(int nodePosition)
        {
            Console.WriteLine(nodes[nodePosition].nodeName);
        }

        public int visiteNode(int oneNode)//检查某节点是否还有未访问过的相邻节点。
        {
            for (int j = 0; j < nodeNumMax; j++)
            {
                if (adjmatrix[oneNode, j] == 1 && nodes[j].isVisited == false)
                    return j;
            }
            return -1;
        }

        public void 广度优先搜索()
        {
            //创建队列,以方便实现自动搜索。
            Queue nodeQueue = new Queue();
            //访问第一个节点
            nodes[0].isVisited = true;
            displayNode(0);
            nodeQueue.Enqueue(0);

            //访问之后的节点
            int node1;
            int node2;

            while (nodeQueue.Count > 0 && nodes[nodeNumNow - 1].isVisited != true)//除了判断节点以外,新加了一个判断,当最后一个节点被访问了以后,整个循环就停止
            {
                node1 = (int)nodeQueue.Dequeue();//将队列中的第一个节点弹出,并记录。
                node2 = visiteNode(node1);//寻找节点1指向的节点。

                while (node2 != -1 && nodes[nodeNumNow - 1].isVisited != true)
                {
                    Console.WriteLine(nodes[node1].nodeName + "=>" + nodes[node2].nodeName);//显示哪个节点指向哪个节点。
                    //广度优先搜索,首先就是把与第一个点相邻的点全部找出来,储存在queue里面。
                    nodeQueue.Enqueue(node2);
                    nodes[node2].isVisited = true;
                    displayNode(node2);
                    node2 = visiteNode(node1);
                }
            }
        }

        //重置所有被访问过的节点
        public void resetNode()
        {
            for (int i = 0; i < nodeNumMax; i++)
            {
                nodes[i].isVisited = false;
            }
        }
    }



    class Program
    {
        static void Main(string[] args)
        {
            Gragh graphInstance = new Gragh();

            //添加节点
            graphInstance.addNode("A");//编号0
            graphInstance.addNode("B");//编号1
            graphInstance.addNode("C");//编号2
            graphInstance.addNode("E");//编号3
            graphInstance.addNode("D");//编号4
            graphInstance.addNode("F");//编号5
            graphInstance.addNode("G");//编号6
            graphInstance.addNode("H");//编号7

            //添加边
            graphInstance.addEdge(0, 1);//A=>B
            graphInstance.addEdge(0, 2);//A=>C
            graphInstance.addEdge(1, 4);//B=>D
            graphInstance.addEdge(4, 2);//D=>C
            graphInstance.addEdge(2, 3);//C=>E
            graphInstance.addEdge(4, 5);//D=>F
            graphInstance.addEdge(3, 5);//E=>F
            graphInstance.addEdge(5, 6);//F=>G
            graphInstance.addEdge(0, 0);//G=>H
            graphInstance.addEdge(2, 7);//C=>H

            graphInstance.广度优先搜索();

        }
    }
}

代开银行存款证明公司湘潭定制存款证明营口定期存单好不好北京代开出国留学存款证明鹤岗银行存款证明模板石嘴山定期存单用途泸州存款证明服务商焦作订做出国留学资金证明陇南留学存款证明模板漳州企业资信证明代发牡丹江办资金证明白城存款证明推荐铜仁资金证明报价临汾定期存单哪家比较好无锡留学存款证明哪家比较好芜湖企业资金证明价格盘锦打定期存单肇庆资信证明图片开封留学存款证明模板衢州定期存单哪里有齐齐哈尔企业资信证明多少钱永州定制银行存款证明云浮留学存款证明开具安康企业资信证明作用漳州留学存款证明打印合肥银行定期存单怎么样徐州银行定期存单哪家好安阳银行存款证明代做牡丹江资信证明查询徐州留学存款证明供应商保山出国留学存款证明定做香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声汪小菲曝离婚始末卫健委通报少年有偿捐血浆16次猝死单亲妈妈陷入热恋 14岁儿子报警雅江山火三名扑火人员牺牲系谣言手机成瘾是影响睡眠质量重要因素男子被猫抓伤后确诊“猫抓病”中国拥有亿元资产的家庭达13.3万户高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了男孩8年未见母亲被告知被遗忘张家界的山上“长”满了韩国人?倪萍分享减重40斤方法许家印被限制高消费网友洛杉矶偶遇贾玲何赛飞追着代拍打小米汽车超级工厂正式揭幕男子被流浪猫绊倒 投喂者赔24万沉迷短剧的人就像掉进了杀猪盘特朗普无法缴纳4.54亿美元罚金周杰伦一审败诉网易杨倩无缘巴黎奥运专访95后高颜值猪保姆德国打算提及普京时仅用姓名西双版纳热带植物园回应蜉蝣大爆发七年后宇文玥被薅头发捞上岸房客欠租失踪 房东直发愁“重生之我在北大当嫡校长”校方回应护栏损坏小学生课间坠楼当地回应沈阳致3死车祸车主疑毒驾事业单位女子向同事水杯投不明物质路边卖淀粉肠阿姨主动出示声明书黑马情侣提车了奥巴马现身唐宁街 黑色着装引猜测老人退休金被冒领16年 金额超20万张立群任西安交通大学校长王树国卸任西安交大校长 师生送别西藏招商引资投资者子女可当地高考胖东来员工每周单休无小长假兔狲“狲大娘”因病死亡外国人感慨凌晨的中国很安全恒大被罚41.75亿到底怎么缴考生莫言也上北大硕士复试名单了专家建议不必谈骨泥色变“开封王婆”爆火:促成四五十对测试车高速逃费 小米:已补缴天水麻辣烫把捣辣椒大爷累坏了

代开银行存款证明公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化