图的广度优先遍历(BFS)

图的相关概念先省略,对于广度优先遍历(BFS)

1、从第一个顶点开始,每走一步依次遍历与此相连的顶点。

2、然后输出第一个顶点,再依次遍历与第二个顶点相连的所有顶点

3、重复第二步,直到遍历完所有顶点。

直接说一个例子:对于一个图,邻接表与邻接矩阵如下


BFS实现流程:

(1)实例化一个队列,从邻接矩阵中的第一个顶点,依次放入与此相连的顶点

(2)遍历完与第一个顶点相连的所有顶点后,弹出第一个顶点,然后遍历与第二个顶点相连的顶点(除去前面已经进队的顶点)。

(3)按照上一步操作,依次执行

(4)依次进队

(5)弹出队列中所有元素

实现代码:

//用来定义顶点的JavaBean
public class Vertex {
	 private String value;
	public boolean visited;
	 
	 public Vertex(String value) {
		 this.setValue(value);
	 }
	 public Vertex() {
		 
	 }

	public String getValue() {
		return value;
	}

	public void setValue(String value) {
		this.value = value;
	}	  
}
//生成图以及定义各种方法的类
public class Graph {
	Vertex[] vertex;
	public int[][] adjMat;
	int currentSize;
	
	
	//构造方法,传入顶点的数量
	public Graph(int size) {
		vertex = new Vertex[size];
		adjMat = new int[size][size];
		//初始化邻接矩阵的对角线元素为1
		for(int i=0;i<vertex.length;i++) {
			for(int j=0;j<vertex.length;j++) {
				if(i ==j) {
					adjMat[i][j] =1;
				}
			}
		}
	}
	//把顶点加入到顶点数组中
	public void addVertex(Vertex v) {
		vertex[currentSize++] = v;
	}
	//把边加入到图中
	public void addEdge(String v1, String v2) {
		//定义一个变量,用来记录数组中值与v1相等的索引
		int index1 = 0;
		//在数组中找与v1相等的值的索引值
		for(int i=0; i<vertex.length;i++) {
			if(vertex[i].getValue().contentEquals(v1)) {
				index1 = i;
				break;
			}			
		}
		//记录与v2相等的索引
		int index2 = 0;
		for(int i=0;i<vertex.length;i++) {
			if(vertex[i].getValue().contentEquals(v2)) {
				index2 = i;
				break;
			}
		}
		//把矩阵中的数置为1表示有链接
		adjMat[index1][index2] =1;
		adjMat[index2][index1] =1; 	
	}
	
   //广度优先搜索遍历
   public void bfs() {
       //初始化顶点矩阵的访问标志
	   for(int i=0;i<vertex.length;i++)
		   vertex[i].visited = false;
       //定义队列
	   Queue<String>queue = new LinkedList<String>();
       //把第一个顶点的访问标志置为true
	   vertex[0].visited =true;
      //把第一个顶点的值放入队列中
	   queue.add(vertex[0].getValue());
      //记录邻接矩阵的行
	   int currentIndex = 0;
	   //循环
       while(!queue.isEmpty()){
           for(int i=currentIndex+1;i<vertex.length;i++){
               //如果存在和前一个顶点的连接,且尚未加入队列中
               if(adjMat[currentIndex][i]==1&&vertex[i].visited==false){
            	  //置访问标志为true 
                      vertex[i].visited =true;
                      //把顶点值加入队列
            	   queue.add(vertex[i].getValue());
               }
           }         
           //弹出队头元素
           System.out.println(queue.remove());
           //判断栈是否为空,
           if(queue.isEmpty() ==false){ 
               //行自增     	 
               currentIndex++;
           }          
       }
   }
   //测试
   public static void main(String[] args){	
		String[] arr = new String[] {"A","B","C","D","E"};
		
		Vertex v1 = new Vertex(arr[0]);
		Vertex v2 = new Vertex(arr[1]);
		Vertex v3 = new Vertex(arr[2]);
		Vertex v4 = new Vertex(arr[3]);
		Vertex v5 = new Vertex(arr[4]);

		//实例化一个图对象
		Graph g = new Graph(5);
		//把顶点加入图中
		g.addVertex(v1);
		g.addVertex(v2);
		g.addVertex(v3);
		g.addVertex(v4);
		g.addVertex(v5);
		//把边加入到图中
	    g.addEdge("A","B");
	    g.addEdge("A","C");
	    g.addEdge("B","C");
	    g.addEdge("B","D");
	    g.addEdge("B","E");
		
	    //遍历邻接矩阵
	    for(int[] s:g.adjMat) {
	    	System.out.println(Arrays.toString(s));
	    }
        //深度优先搜索算法
	    g.dfs();   
   }
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值