广度优先搜索是图的一种算法,一是可以确定有没有到达的路径,而是如果有那么这个路径就是最短路径。就像水波那样,先从原点向周围一圈一圈的搜索(假设一圈有好多数据),没有才向更外圈搜索。
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),这时候就找到了。如果好友关系网中都没有这个人(那就是队列为空了)。