Breadth-first search

given a graph G  and a distinguished source vertex s, breadth-first
search systematically explores the edges of G to “discover” every vertex that is
reachable from s.

To keep track of progress, breadth-first search colors each vertex white, gray, or
black. All vertices start out white and may later become gray and then black. A
vertex is discovered the first time it is encountered during the search, at which time
it becomes nonwhite. Gray and black vertices, therefore, have been discovered, but
breadth-first search distinguishes between them to ensure that the search proceeds
in a breadth-first manner

  1 package element_graph;
  2
  3
  4 import java.util.Iterator;
  5 import java.util.LinkedList;
  6 import java.util.List;
  7
  8
  9
 10 import edu.princeton.cs.algs4.Queue;
 11
 12
 13 public class breadth_first_search {
 14     private static class vertex{
 15         private LinkedList<vertex> link;
 16         private String name;
 17         private String color;
 18         private vertex p;
 19         private int d;
 20         public vertex(String na,LinkedList<vertex> lin){
 21             name = na;
 22             link = lin;
 23             color = "white";
 24             p = null;
 25             d = 9999;
 26         }
 27     }
 28     public static void BFS(vertex s){
 29         s.color = "grey";
 30         s.d = 0;
 31         Queue<vertex> q = new Queue<vertex>();
 32         q.enqueue(s);
 33         while(!q.isEmpty()){
 34             vertex u = q.dequeue();
 35             for (vertex v : u.link) {  //every adj
 36                 if(v.color == "white"){
 37                     v.color = "gray";
 38                     v.d = v.d + 1;
 39                     v.p = u;
 40                     q.enqueue(v);
 41                 }
 42             }
 43             u.color = "black";
 44             }
 45
 46     }
 47     public static void printpath(vertex s,vertex v){
 48         if(v == s){
 49             System.out.println(s.name);
 50         }
 51         else if(v.p == null){  //will not get s
 52             System.out.println("no way");
 53         }
 54         else{
 55             printpath(s,v.p);
 56             System.out.println(v.name);
 57         }
 58     }
 59
 60
 61
 62
 63      public static void main(String[] args) {
 64             LinkedList<vertex> sl = new LinkedList<vertex>();
 65
 66             LinkedList<vertex> rl = new LinkedList<vertex>();
 67
 68             LinkedList<vertex> vl = new LinkedList<vertex>();
 69
 70             LinkedList<vertex> wl = new LinkedList<vertex>();
 71
 72             LinkedList<vertex> tl = new LinkedList<vertex>();
 73
 74             LinkedList<vertex> xl = new LinkedList<vertex>();
 75
 76             LinkedList<vertex> ul = new LinkedList<vertex>();
 77
 78             LinkedList<vertex> yl = new LinkedList<vertex>();
 79
 80             vertex sv = new vertex("s",sl);
 81             vertex rv = new vertex("r",rl);
 82             vertex vv = new vertex("v",vl);
 83             vertex wv = new vertex("w",wl);
 84             vertex tv = new vertex("t",tl);
 85             vertex xv = new vertex("x",xl);
 86             vertex uv = new vertex("u",ul);
 87             vertex yv = new vertex("y",yl);
 88             sl.add(rv);
 89             sl.add(wv);
 90             rl.add(sv);
 91             rl.add(vv);
 92             vl.add(rv);
 93             wl.add(xv);
 94             wl.add(tv);
 95             wl.add(sv);
 96             tl.add(xv);
 97             tl.add(uv);
 98             tl.add(wv);
 99             xl.add(tv);
100             xl.add(uv);
101             xl.add(yv);
102             xl.add(wv);
103             xl.add(tv);
104             xl.add(xv);
105             xl.add(yv);
106             xl.add(uv);
107             xl.add(xv);
108              BFS(sv);
109              printpath(sv,tv);
110
111         }
112 }
113  
时间: 2024-10-13 00:37:49

Breadth-first search的相关文章

图的遍历之广度优先搜索(Breadth First Search)

描述 广度优先搜索算法(Breadth First Search)与树的层序遍历(level-order traversal)类似,基本思想是思想是: 从图中某顶点v出发,访问v之后,并将其访问标志置为已被访问,即visited[i]=1: 依次访问v的各个未曾访问过的邻接点: 分别从这些邻接点出发依次访问它们的邻接点,并使得"先被访问的顶点的邻接点先于后被访问的顶点的邻接点被访问,直至图中所有已被访问的顶点的邻接点都被访问到: 如果此时图中尚有顶点未被访问,则需要另选一个未曾被访问过的顶点作为

BFS—— Breadth First Search 广度优先算法

Breadth First Search BFS家伙还是很有用的,特地从wiki扒了一个动态的图,来帮助感性的理解这个动态搜索的过程. 对于如下一个无权值的有向图,在进行广度优先搜索呢?这里我们的代码实现是,以节点3为入口 对于BFS的理论基础介绍,个人觉得还是看<DSAA>比较好.这里不做介绍,注重分析该搜索算法的实现. 如果对于图这种数据结构不熟悉,这个BFS一般是搞不定的... 下面分别是无向图的邻接表实现和邻接矩阵实现 http://blog.csdn.net/cinmyheart/a

Breadth First Search VS Depth First Search (Algorithms)

First lets recall the concept for BFS and DFS. I will use below Binary Tree as an example. Before that, lets go through some of the concepts of Trees and Binary Trees quickly. Concept of Binary Trees A binary tree is made of nodes, where each node co

(总结)宽度优先搜索(Breadth First Search)

ACM入门最经典的开局一般都是宽搜. 宽度优先搜索(以下均简称bfs)一般用于树和图的搜索,在ACM中属于比较基础的技巧,因此需要非常熟练的掌握. 那么从最基础的bfs开始讲起.在一个迷宫中,有一个起点和一个终点(出口),和一些障碍物(无法通过). 比如下图

Chapter four Breadth First Search(宽度优先搜索)

BFS最主要的数据结构是Queue,由LinkedList实现. 1.binary-tree-level-order-traversal(二叉树的层次遍历) 给出一棵二叉树,返回其节点值的层次遍历(逐层从左往右访问) BFS解法[基本模板]: public class Solution { /** * @param root: The root of binary tree. * @return: Level order a list of lists of integer */ public

图论算法(5) --- 双向广搜求最短路(Bidirectional Breadth First Search)

我们知道,在图论算法中,求最短路是最基本的问题.在求最短路的问题中,应用双向广度优先搜索算法,又是一个较为高效而又简单的算法.所谓双向广度优先搜索,其实根本的核心还是BFS,只不过它是从起点和终点两头同时搜索,大大提高了搜索效率,又节省了搜索空间.广搜大家知道当然是用队列来实现了,在这里,要注意的问题就是,我们必须按层搜索,正向队列处理一层,接着去处理反向队列的一层,按层交替进行,而不是按节点交替进行,这点需要注意,其他的也就很简单了,代码中附有注释,如有问题请留言. package simil

无向图的深度优先与广度优先搜索代码实现

图采用了邻接表的形式储存. 带不带权都无所谓的 深度优先搜索 Depth First Search 道理和树的先序遍历差不多,把将要访问的点入栈,然后从栈里取点进行访问. 由于这只是类中的一个成员函数,有些被调用的函数的具体代码将会在文章最后补上 ,但是函数功能看注释就好了 1 //深度优先 2 void GraphAdjacencyListWeight::DFSAdvanced(int StartVertex) { 3 int *visited = new int[VertexNumber];

无权最短路 - 宽度优先搜索

2017-09-13 21:54:52 writer:pprp 图论全部都忘记了,重新学一下吧,之前学的实在是太烂了 测试数据如下: 7 12//顶点个数, 路径个数3 11 41 22 42 54 34 54 64 73 65 76 73//起始点 代码如下: /* @theme:无权最短路径问题 @complexity:O(|E| + |V|) @writer:pprp @begin:21:10 @end:21:53 @error: @declare: breadth first searc

数据结构学习笔记05图 (邻接矩阵 邻接表--&gt;BFS DFS)

数据结构之图 图(Graph) 包含 一组顶点:通常用V (Vertex) 表示顶点集合 一组边:通常用E (Edge) 表示边的集合 边是顶点对:(v, w) ∈E ,其中v, w ∈ V 有向边<v, w> 表示从v指向w的边(单行线) 不考虑重边和自回路 无向图:边是无向边(v, w) 有向图:边是有向边<v, w> 连通:如果从V到W存在一条(无向)路径,则称V和W是连通的 连通图(Connected Graph):如果对于图的任一两个顶点v.w∈V,v和w都是连通的,则称

特征选择常用算法综述

特征选择的一般过程: 1.生成子集:搜索特征子集,为评价函数提供特征子集 2.评价函数:评价特征子集的好坏 3.停止准则:与评价函数相关,一般是阈值,评价函数达到一定标准后就可停止搜索 4.验证过程:在验证数据集上验证选出来的特征子集的有效性 1.生成子集 搜索算法有 完全搜索.启发式搜索.随机搜索 三大类. (1)完全搜索 <1>宽搜(Breadth First Search):时间复杂度高,不实用 <2>分支界限搜索(Branch and Bound):其实就是宽搜加上深度的限