广度优先搜索

广度优先搜索是图的一种算法,一是可以确定有没有到达的路径,而是如果有那么这个路径就是最短路径。就像水波那样,先从原点向周围一圈一圈的搜索(假设一圈有好多数据),没有才向更外圈搜索。


class Vertex {
    public string data;
    public bool isVisited;

    public Vertex(string d) {
        data = d;
        isVisited = false;
    }
}

class Program
{
    static Dictionary<string, Vertex[]> dict = new Dictionary<string, Vertex[]>();
    static void Main(string[] args)
    {
        Vertex A = new Vertex("Bom");
        Vertex B = new Vertex("Tom");
        Vertex C = new Vertex("Chicai");
        Vertex D = new Vertex("Marry");

        //构建关系图,谁是谁的好友
        //I是原点,AB为第一圈,D为第二圈,C为第三圈
        dict.Add("I", new Vertex[] { A, B });
        dict.Add("Bom", new Vertex[] { D });
        dict.Add("Tom", new Vertex[] { D });
        dict.Add("Marry", new Vertex[] { A,B,C });
        dict.Add("Chicai", new Vertex[] { D });

        Search("Chicai");

        Console.ReadKey();

    }

    static void Search(string name) {
        Queue<Vertex> queue = new Queue<Vertex>();
        Vertex[] datas;
        dict.TryGetValue("I", out datas);
        foreach (Vertex x in datas) {
            queue.Enqueue(x);
        }

        while (queue.Count > 0) {
            Vertex x = queue.Dequeue();
            if (x.isVisited) {
                continue;
            }
            x.isVisited = true;
            if (x.data == name)
            {
                Console.WriteLine("找到了:" + name);
                return;
            }
            else {
                Console.WriteLine(x.data);
                Vertex[] vertex;
                dict.TryGetValue(x.data, out vertex);
                foreach (Vertex v in vertex) {
                        queue.Enqueue(v);
                }
            }
        }

        Console.WriteLine("找不到啊");
    }
}


这里是一个找好友的游戏,通过好友来找好友,例如找一个叫Chicai的好友,首先从我自己这里找AB(Bom,Tom)都不是,那么就将他们的好友也加进队列中进行查找,这时候就有了D(Marry),发现D也不是,那么将Marry的好友也加进队列,这时候才有了C(Chicai),这时候就找到了。如果好友关系网中都没有这个人(那就是队列为空了)。


首页 我的博客
粤ICP备17103704号